当id dos没有自动增量时,如何在使用sqlalchemy插入行时指定主id?

时间:2014-01-27 19:25:34

标签: python sqlalchemy

我的数据库表的主键id不是自动增量(序列)。因此,用户可以创建唯一的ID,否则插入将失败。

此表不在我的控制之下,因此我无法更改数据库结构。

from sqlalchemy import create_engine, Table, MetaData
import psycopg2
db = create_engine('postgresql://...', echo=False).connect()
meta = MetaData()
meta.reflect(bind=db)
t = Table("mytable", meta, autoload=True, autoload_with=db)
values = { "title":"title", "id": ... }#  ???
t.insert(bind=db, values=values).execute()

1 个答案:

答案 0 :(得分:1)

鉴于这是“单用户”/“单客户”系统,您应该能够使用Column defaults: Python-Executed Functions。链接到的文档上的示例足以让您入门。但是,我会使用python函数,但是仍然存储在全局变量中的数据库adn正确初始化:

def new_id_factory():
    if not('_MYTABLE_ID_' in globals()):
        q = db.execute("select max(mytable.id) as max_id from mytable").fetchone()
        _MYTABLE_ID_ = (q and q.max_id) or 0
    _MYTABLE_ID_ += 1
    return _MYTABLE_ID_


t = Table("mytable", Base.metadata,
    Column('id', Integer, primary_key=True, default=new_id_factory), #
    autoload=True, autoload_with=db,
    )