我希望这对某些人有所帮助,我发现你需要创建没有rowid列的表,然后你可以简单地将字段rowid映射到对象中的一列。
*如果你调用Base.Metadata.create_all(engine)列表rowid将在表中创建,这将禁用sqlite rowid生成。
*没有检查如果主键是Integer会发生什么,我认为这将覆盖rowid。
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import *
# create the table
metadata = MetaData()
user = Table('users', metadata,
Column('name', String, primary_key=True),
Column('fullname', String))
engine = create_engine('sqlite:///example.db')
metadata.create_all(engine)
# create the user object
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
name = Column(String, primary_key=True)
fullname = Column(String)
rowid = Column(Integer)
def __repr__(self):
return "User: name='%s', fullname='%s'" % (self.name, self.fullname)
# insert users
Session = sessionmaker()
Session.configure(bind=engine)
u1 = User(name='ed', fullname='Ed Jones')
u2 = User(name='fred', fullname='Fred Jones')
u3 = User(name='ted', fullname='Ted Jones', rowid=99)
session = Session()
session.add_all([u1, u2, u3])
session.commit()
# read users
users = session.query(User).all()
for user in users:
print(user, ", rowid=", user.rowid)
输出:
User: name='ed', fullname='Ed Jones' , rowid= 1
User: name='fred',fullname='Fred Jones' , rowid= 2
User: name='ted', fullname='Ted Jones' , rowid= 99