SQLAlchemy ORM通过检查lis中是否有其他表值来更新值

2024-09-30 02:33:57 发布

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

我有一个日本汉字列表,看起来像:

kanji_n3 = ['政', '議', '民', '連']  # But then with 367 Kanji

我有两个表:TableKanji和{}。TableMisc有一个名为“jlpt”的列,其中一些列当前的值为2,但如果汉字在kanji_n3中,则必须将其更新为值3。在

在表格类.py在

^{pr2}$

所以我提出的问题是,汉字起源_索引.py公司名称:

import sqlalchemy as sqla
import sqlalchemy.orm as sqlo
from tableclass import TableKanji, TableMisc

kanji_n3 = ['政', '議', '民', '連']  # But then with 367 Kanji

session.query(TableMisc)\
    .filter(TableMisc.jlpt == 2).filter(TableKanji.character in kanji_n3)\
    .update({TableMisc.jlpt: TableMisc.jlpt + 1}, synchronize_session='fetch')

此运行成功,但不更新任何内容。输出:

2016-10-18 04:05:53,908 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
2016-10-18 04:05:53,908 INFO sqlalchemy.engine.base.Engine ()
2016-10-18 04:05:53,908 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
2016-10-18 04:05:53,909 INFO sqlalchemy.engine.base.Engine ()
2016-10-18 04:05:53,909 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2016-10-18 04:05:53,909 INFO sqlalchemy.engine.base.Engine SELECT "Misc".kanji_id AS "Misc_kanji_id" 
FROM "Misc" 
WHERE 0 = 1
2016-10-18 04:05:53,909 INFO sqlalchemy.engine.base.Engine ()
2016-10-18 04:05:53,910 INFO sqlalchemy.engine.base.Engine UPDATE "Misc" SET jlpt=("Misc".jlpt + ?) WHERE 0 = 1
2016-10-18 04:05:53,910 INFO sqlalchemy.engine.base.Engine (1,)
2016-10-18 04:05:53,911 INFO sqlalchemy.engine.base.Engine COMMIT

问题

如何更新当前值为2的TableMisc.jlpt,以及其中的位置表汉字.字符在kanji_n3中?我的in kanji_n3语句不是这样工作的吗?我还试图添加一个.outerjoin(TableKanji),但结果是:

sqlalchemy.exc.InvalidRequestError: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called

Tags: fromimportinfobasesqlalchemyasselectengine
1条回答
网友
1楼 · 发布于 2024-09-30 02:33:57

似乎您的目的是更新联接表。并非所有数据库都支持此功能。在

首先应该使用^{}方法,而不是in运算符。在

您可以先选择,然后按如下方式更新所有选定的记录:

records = session.query(TableMisc).\
    join(TableKanji).\
    filter(TableMisc.jlpt == 2).\
    filter(TableKanji.character.in_(kanji_n3)).\
    all()

for record in records:
    record.jlpt += 1

session.commit()

相关问题 更多 >

    热门问题