sqlalchemy:仅插入行的一部分

时间:2013-03-03 10:20:44

标签: python insert sqlalchemy

我是sqlalchemy的新手并遇到问题。 我找不到只插入新行的一部分的方法。 使用session.add()如果我提供所有列,我可以插入一行。但是,如果我只想提供一些列呢?

在互联网上,我发现有些地方告诉我使用.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)

我做错了什么?

2 个答案:

答案 0 :(得分:1)

'部分'插入意味着与完整插入相同,但是您没有将值指定为NULL。数据库仍然可以使用您省略的列的架构中指定的默认值替换NULL值。

在SQLAlchemy中,这意味着您将这些相同的列设置为None;你甚至不必明确地这样做。

请注意,您在__init__课程中不需要 Users方法。这可能使您更难以指定某些列。 SQLAlchemy声明性基础为您提供了一个默认的__init__方法,可以执行已经的操作,但也保留了默认值。

如果您不想完全删除__init__,请将__init__方法更改为默认为None或明确指定None列值,例如Burhan的答案:

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__,那么这也行。)

答案 1 :(得分:0)

由于您使用的是declarative base,因此您可以执行以下操作:

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