SQLAlchemy在提交后不从自动增量设置主键

use*_*836 3 python postgresql sqlalchemy

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
);
Run Code Online (Sandbox Code Playgroud)

设置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)
Run Code Online (Sandbox Code Playgroud)

尝试并存储模型:

my_model = MyModel()
user_id = 1
type = "A type"
session.merge(my_model)
session.commit()
my_model.id #Always None, don't know why
Run Code Online (Sandbox Code Playgroud)

my_model.idNone提交后仍然存在.我也尝试过调用close会话,但这也没有用.

use*_*836 9

结果我不明白之间的区别

session.merge(my_model)
Run Code Online (Sandbox Code Playgroud)

session.add(my_model)
Run Code Online (Sandbox Code Playgroud)

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

my_model = session.merge(my_model)
Run Code Online (Sandbox Code Playgroud)

add 另一方面,将给定的对象添加到会话中.