9

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

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

我有user表:1d,名称我有status表:id,名称我有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 并且可以这样做:

class User(Base):
    ....
    @staticmethod
    def prefetch_id():
        db.session.execute("SELECT NEXTVAL('user_id_seq');").scalar()

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

关于如何做到这一点的任何想法?请记住,这可能是一个非常高的事务应用程序,一次被成千上万的用户访问

4

2 回答 2

17

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

Sequence 对象还可以像 SQL 表达式一样独立执行,具有调用其“下一个值”函数的效果:

seq = Sequence('some_sequence')
nextid = connection.execute(seq)
于 2013-02-25T20:11:59.823 回答
4

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

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

然后对象add()-ed 将更新它们的序列列 ( id) user.id,因此status.id不会再更新None了。

于 2015-12-15T14:02:53.447 回答