1

我是 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)

我究竟做错了什么?

4

2 回答 2

1

“部分”插入意味着与完整插入相同,但您未指定 left 为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__

于 2013-03-03T10:26:49.797 回答
0

由于您使用的是声明式 base,因此您可以简单地执行以下操作:

u = Users('foo',None,None)
session.add(u)
session.commit()
于 2013-03-03T10:31:16.223 回答