我想获得最后插入的主键,我已经知道了两种方法:
1)“lastrowid”与“原始SQL”
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, text
engine = create_engine('sqlite://')
meta = MetaData()
tbl = Table('tbl', meta,
Column('f1', Integer, primary_key=True),
Column('f2', String(64))
)
tbl.create(engine)
sql = text("INSERT INTO tbl VALUES (NULL, 'some_data')")
res = engine.execute(sql)
print(res.lastrowid)
2)“inserted_primary_key”,带有“insert()”
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite://')
meta = MetaData()
tbl = Table('tbl', meta,
Column('f1', Integer, primary_key=True),
Column('f2', String(64))
)
tbl.create(engine)
ins = tbl.insert().values(f2='some_data')
res = engine.execute(ins)
print(res.inserted_primary_key)
但我的问题是“declarative_base()”
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite://')
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
class TBL(Base):
__tablename__ = 'tbl'
f1 = Column(Integer, primary_key=True)
f2 = Column(String(64))
Base.metadata.create_all(engine)
rcd = TBL(f2='some_data')
session.add(rcd)
session.commit()
如果我这样做:
res = session.add(rcd)
它给我“无”。或者如果我这样做:
res = session.commit()
发生同样的事情。我的问题是:
在“declarative_base()”的情况下,有没有什么好方法可以访问“lastrowid”或“inserted_primary_key”?
最好的方法是什么?
答案 0 :(得分:8)
调用session.commit()
后,访问rcd.f1
将返回其生成的主键。 SQLAlchemy在expired by the commit之后自动从数据库重新加载该对象。