我的数据库表的主键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()
答案 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,
)