簡體   English   中英

如何在sqlalchemy中使用子查詢添加行?

[英]How to Add rows using subqueries in sqlalchemy?

我正在將Postgresql與SQLAlchemy一起使用,但似乎sqlalchemy在使用子查詢時無法添加行。

在我的示例中,我想更新表中特定標簽的計數器。

在SqlAlchemy中,測試運行類如下所示:

class TestRun( base ):
    __tablename__   = 'test_runs'

    id              = sqlalchemy.Column( 'id', sqlalchemy.Integer, sqlalchemy.Sequence('user_id_seq'), primary_key=True )
    tag             = sqlalchemy.Column( 'tag', sqlalchemy.String )
    counter         = sqlalchemy.Column( 'counter', sqlalchemy.Integer )

插入代碼應如下所示:

tag = 'sampletag'
counterquery = session.query(sqlalchemy.func.coalesce(sqlalchemy.func.max(TestRun.counter),0) + 1).\
                            filter(TestRun.tag == tag).\
                            subquery()

testrun = TestRun()
testrun.tag = tag
testrun.counter = counterquery

session.add( testrun )
session.commit()

問題在於,在運行此代碼時會產生一個非常有趣的錯誤,它正在嘗試運行以下SQL查詢:

'INSERT INTO test_runs (id, tag, counter) 
    VALUES (%(id)s, 
            %(tag)s, 
            SELECT coalesce(max(test_runs.counter), %(param_1)s) + %(coalesce_1)s AS anon_1 
               FROM test_runs 
               WHERE test_runs.tag = %(tag_1)s)' 
 {'coalesce_1': 1, 'param_1': 0, 'tag_1': 'mytag', 'tag': 'mytag', 'id': 267L}

這看起來很合理,只是在SELECT調用周圍缺少括號。 當我手動運行SQL查詢時,它會給我與sqlalchemy相同的確切錯誤,直到我手動輸入括號后才能解決所有問題。 似乎是一個不太可能的錯誤,sqlalchemy會在需要時忘記加上括號,所以我的問題是我是否缺少使用sqlalchemy添加行時正確使用子查詢的功能?

而不是使用subquery()調用as_scalar()方法

返回此查詢表示的完整SELECT語句,並將其轉換為標量子查詢。

例:

具有父子關系分類的模型:

class Parent(Base):
    __tablename__ = 'parents'
    id = Column(Integer, primary_key=True)
    counter = Column(Integer, nullable=False, default=0)

class Child(Base):
    __tablename__ = 'children'
    id = Column(Integer, primary_key=True)
    parent_id = Column(ForeignKey(Parent.id), nullable=False)
    parent = relationship(Parent)

更新counter字段的代碼:

parent.counter = session.query(func.count(Child.id))\
                    .filter_by(parent=parent).as_scalar()

產生的SQL(從日志中復制):

UPDATE parents SET counter=(SELECT count(children.id) AS count_1 
FROM children
WHERE ? = children.parent_id) WHERE parents.id = ?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM