SQLalchemy:onupdate自动增量(服务器端)

SQLalchemy:onupdate自动增量(服务器端),sqlalchemy,flask-sqlalchemy,Sqlalchemy,Flask Sqlalchemy,在SQLalchemy中,我在mixin中使用这个声明的属性: @declared_attr def updated_seq(cls): return db.Column(db.BigInteger(), server_default=0) 我想做一个onupdate,其中SQLServer(而不是python)自动将值增加1。怎样才能做到呢?德克萨斯州 例如,我在onupdate期间查找以下sql等效语句: UPDATE updated_seq=updated_seq+1 您可以使用事件侦

在SQLalchemy中,我在mixin中使用这个声明的属性:

@declared_attr
def updated_seq(cls): return db.Column(db.BigInteger(), server_default=0)
我想做一个onupdate,其中SQLServer(而不是python)自动将值增加1。怎样才能做到呢?德克萨斯州

例如,我在onupdate期间查找以下sql等效语句:

UPDATE updated_seq=updated_seq+1

您可以使用事件侦听器处理这种情况,该侦听器递增
updated\u seq

class Mixin(object):
    @declared_attr
    def updated_seq(cls):
        return Column(BigInteger, server_default='0')

class Person(Base, Mixin):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(Text)

@event.listens_for(Person, 'before_update')
def increment_seq(mapper, connection, target):
    target.updated_seq += 1

>>> p = Person(name="foo")
>>> session.add(p)
>>> session.commit()
>>> p = session.query(Person).first()
>>> p.updated_seq
0
>>> p.name = "bar"
>>> session.commit()
>>> p = session.query(Person).first()
>>> p.updated_seq
1

事实上,正确的答案很简单:

@declared_attr
def updated_seq(cls): return db.Column(db.BigInteger(), server_default=0, onupdate=text('updated_seq + 1'))

听起来像是触发器的工作。首先,在某处进行混音:

class Mixin(object):
    @declared_attr
    def updated_seq(cls):
        return Column(BigInteger, server_default='0')
然后,无论是启动文件还是脚本,只要你喜欢(我想不出任何真正优雅的东西)。这里是PSQL中的一个解决方案

# import Mixin
# import sqlalchemy engine    
for class_ in Mixin.__subclasses__:
    engine.execute('''
CREATE OR REPLACE FUNCTION %{tablename}s_increment() RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_seq := OLD.updated_seq + 1 WHERE id = OLD.id;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE TRIGGER %{tablename}s_increment_trigger BEFORE UPDATE ON %{tablename}s
FOR EACH ROW EXECUTE PROCEDURE %{tablename}s_increment();
``` % {tablename: class_.__tablename__}
您可能需要在这方面检查我的SQL,因为这已经有一段时间了,而且还没有经过测试。但无论如何,它将在数据库中创建触发器,用于检测并自动递增该行。缺点是您需要手动删除任何丢失更新的_seq列的触发器


编辑:看起来OP找到了一个比我更简单的解决方案。哦。

但是这是由python增加的,不是由sql server增加的,对吗?因此,这不是原子性的,而是将“Python增量”转换为SQL。您可以回显SQL以进行确认。用SQL输出和您期望的一系列事务来澄清您的问题。我重复了SQL,看到了“updateupdated_seq=value”(值由python从会话中递增)。我要找的是一个类似“UPDATE updated_seq=updated_seq+1”的语句