2013-03-03 101 views
1

我是sqlalchemy的新手,遇到問題。 我找不到只插入新行的一部分的方法。 隨着session.add()我可以插入一行,如果我給所有列。但是如果我只想給一些專欄呢?sqlalchemy:只插入一行的一部分

在互聯網上,我發現有些地方是叫我用.insert()

sqlalchemy.sql.expression.insert(table, values=None, inline=False, **kwargs) 

(新的節目,所以我並不完全瞭解這些線路還)

我進口

import sqlalchemy 
from sqlalchemy import create_engine 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean 
from sqlalchemy.orm import relationship, backref 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.sql.expression import insert 

Base = declarative_base() 
engine = create_engine('sqlite:///test.db') 

class Users(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String, unique=True) 
    password = Column(String) 
    email = Column(String) 

    def __init__(self, name, password, email): 
     self.name = name 
     self.password = password 
     self.email = email 

Session = sessionmaker(bind=engine) 
Session.configure(bind=engine) 
session = Session() 

session.add(users.insert().values(name="some name")) 

現在這最後一行總是給我一個AttributeError,(Users has no attribute insert)

我做錯了什麼?

回答

1

「部分」插入意味着與完整插入相同,但值不指定爲NULL。數據庫仍可以使用架構中爲您省略的列指定的默認值替換NULL值。

在SQLAlchemy中,這只是表示您將這些列設置爲None;你甚至不必明確地做到這一點。

請注意,您的不需要__init__方法在您的Users類。這可能會讓您更難以不指定某些列。 SQLAlchemy聲明性基礎爲您提供了一個默認方法,它可以執行您想要的已有的,但也保留默認值。

如果你不想完全取消__init__,要麼改變這種__init__法默認爲None或明確指定None的列值像布爾汗的回答呢:

class Users(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String, unique=True) 
    password = Column(String) 
    email = Column(String) 

    def __init__(self, name=None, password=None, email=None): 
     self.name = name 
     self.password = password 
     self.email = email 

然後使用session.add(Users())插入完全'空'行(如果你的刪除了你的__init__)也是有效的。

+0

你能給我怎樣的代碼行會看一個例子嗎?我找到了添加整行的方法。但不是一個正確的語法來填補一些。問題是我有一張50列以上的表格。這將是煩人的填寫一次 – 2013-03-03 10:31:55

+0

@HansdeJong:你看到什麼時候添加一個'全行',你期望*看到什麼?沒有關係數據庫支持「部分行」插入;它們只包含您省略的列的默認值。 – 2013-03-03 10:32:53

+0

所以我必須用Burhan Khalid建議的方式嗎?插入1個完整的行,然後才更新它? – 2013-03-03 10:38:26

0

由於您使用的是declarative base,你可以簡單地做:

u = Users('foo',None,None) 
session.add(u) 
session.commit() 
+0

Jep這是我上班的版本,但據說,我有一張有50列以上的表格,比這種方法開始變得更難看 – 2013-03-03 10:37:26

+0

你有什麼實際問題?如果你的表設置爲'nullable = True',那麼你真的沒有問題。 – 2013-03-03 10:46:36

+0

謝謝你試試這個 – 2013-03-03 11:15:13