我在数据库中预先存在了表,我想使用automap pattern。
但是,为了能够使用此模式,您需要设置主键,如文档中所示(并尝试自己;失败,如this)。
sqlalchemy有没有办法将主键设置为现有的id
列?(理想情况下来自下面显示的Users
对象。)
顺便说一下,我正在使用 postgresql (vs {smlite doesn't seem to allow setting a primary after a table has been created)。
FYI
到目前为止,我已成功访问数据如下:
from sqlalchemy import Table, MetaData
from sqlalchemy.orm import sessionmaker
metadata = MetaData(engine)
Users = Table('users', metadata, autoload=True)
Session = sessionmaker(bind=engine)
session = Session()
user_q = session.query(Users).filter(Users.c.id==1)
但这给了我一个列表,我需要使用索引访问值。我想通过sqlalchemy中通常完成的给定行的属性(列)名称设置值(例如,通过user.first_name = "John"
语法)。
答案 0 :(得分:2)
您也可以更改基础表格,从长远来看这是正确的做法,但如果users.id
中的值唯一标识一行,you can manually instruct SQLAlchemy to treat it as a primary key除{{3} }:
Base = automap_base()
class Users(Base)
__tablename__ = 'users'
# Override id column, the type must match. Automap handles the rest.
id = Column(Integer, primary_key=True)
# Continue with the automapping. Will fill in the rest.
Base.prepare(engine, reflect=True)
答案 1 :(得分:1)
使用原始DDL语句。如果列id
已经是唯一的:
con = sqlalchemy.create_engine(url, client_encoding='utf8')
con.execute('alter table my_table add primary key(id)')
如果id
列不唯一,则必须删除它并重新创建:
con.execute('alter table my_table drop id')
con.execute('alter table my_table add id serial primary key')
在Postgres中,以这种方式添加列将自动填充后续行中连续数字的列。