SQLAlchemy在提交后无法设置自增主键作为主键

3
我正在使用SQLAlchemy连接到一个postgresql数据库。我已经在postgresql中定义了我的主键列,类型为serial,即自增整数,并在我的SQLAlchemy模型中用primary_key=true标记了它们。
在提交SQLAlchemy会话时,模型将保存到数据库中,我可以看到主键设置在数据库中,但是我的SQLAlchemy模型对象上的id属性总是具有None的值,即它没有获取到自增值。我不确定我做错了什么。
我查看了现有的SO问题,但没有找到答案: 下面是我的代码:
在postgres中创建表:
CREATE TABLE my_model
(
    id serial NOT NULL,
    type text,
    user_id integer,

    CONSTRAINT pk_network_task PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

安装SQLAlchemy并设置模型:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

engine = create_engine(db_url, convert_unicode=True, echo=True)
session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))

class MyModel(Base):
    __tablename__ = 'my_model'

    id = sa.Column(sa.Integer, primary_key=True)
    user_id = sa.Column(sa.Integer)
    type = sa.Column(sa.String)

尝试保存模型:
my_model = MyModel()
user_id = 1
type = "A type"
session.merge(my_model)
session.commit()
my_model.id #Always None, don't know why

commit后,my_model.id仍为None。我也尝试在会话上调用close,但这也没有起作用。

1个回答

12
Turns out我没有理解它们之间的区别。
session.merge(my_model)

session.add(my_model)

session.merge(my_model)(我一直在使用)不会将给定对象添加到会话中。相反,它会返回一个新对象,即合并后的模型,并将其添加到会话中。如果您引用此新对象,则一切都很好。

my_model = session.merge(my_model)

add 与此不同,它将其所接收的对象添加到会话中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接