我正在使用SQLAlchemy
连接到postgresql数据库。我已将postgresql中的主键列定义为serial
类型,即自动增加整数,并在SQLAlchemy
模型中使用primary_key=true
标记它们。
在提交SQLAlchemy
会话时,模型将保存到数据库中,我可以看到数据库中的主键集,但id
模型对象上的SQLAlchemy
属性始终具有值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
提交后, my_model.id
仍为None
。我也尝试在会话中调用close
,但这也不起作用。
答案 0 :(得分:8)
原来我不明白
之间的区别session.merge(my_model)
和
session.add(my_model)
session.merge(my_model)
(我一直在使用)不会将给定的对象添加到会话中。相反,它返回一个新对象,即已添加到会话中的合并模型。如果你引用这个新对象一切都很好。
my_model = session.merge(my_model)
另一方面, add
将给定的对象添加到会话中。