预取列序列SQLAlchemy

2024-03-28 14:59:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我的模型相当复杂,我试图从现有的存储过程中获取逻辑并将它们转换为SQLAlchemy(出于可移植性的原因)。在

然而,我正在努力处理未提交的数据。在

我有user表:1d,name 我有status表:id,name 我有user_statuses表:id,user_id,status_id,from_dt,to_dt

现在,我需要在单个事务中填充所有这些表,否则将失败。问题是:

user = User(name = 'Test')
status = Status(name = 'Active')
db.session.add(user)
db.session.add(status)

# Oooopa! This is where it fails
user_session = UserStatuses(user_id=user.id, status_id=status.id, datetime.utcnow(), datetime(9999,01,01,00,00,00))
# both user.id and status.id = None as it's uncommited!

本质上,我需要能够访问表序列而不需要显式SQL。为什么?便于携带。目前我使用PGSQL,可以执行以下操作:

^{pr2}$

将引擎改为MySQL&BANG!应用程序损坏。在

有什么办法吗?请记住,这可能是一个非常高的事务处理应用程序,成千上万的用户一次访问它


Tags: name模型addid应用程序dbdatetimesqlalchemy
2条回答

如果在添加模型对象后但在提交之前刷新会话:

db.session.add(user)
db.session.add(status)
db.session.flush()

然后对象add()-ed将更新其序列列(id),这样user.idstatus.id将不再是{}。在

找到答案了-不知道为什么我以前没看到这个!在

Sequence对象还可以像SQL表达式一样独立执行,其效果是调用其“next value”函数:

seq = Sequence('some_sequence')
nextid = connection.execute(seq)

相关问题 更多 >