SQLAlchemy的;将主键设置为预先存在的db表(不使用sqlite)

时间:2017-08-15 23:52:03

标签: python postgresql sqlalchemy

我在数据库中预先存在了表,我想使用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"语法)。

2 个答案:

答案 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中,以这种方式添加列将自动填充后续行中连续数字的列。