【发布时间】:2020-02-07 23:31:12
【问题描述】:
让我们从定义我的映射类开始
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.types import JSON
from sqlalchemy.ext.mutable import MutableDict
from sqlalchemy import Column, Integer
base = declarative_base()
class MinimalExample(Base):
__tablename__ = 'users'
id = Column(Integer)
data = Column(MutableDict.as_mutable(JSON))
假设我的表中有一行 id=1 和 data={'key_0': 1}
我可以很容易地通过session 对象请求它
first_row = session.query(MinimalExample)\
.filter(MinimalExample.id==1)\
.first()
我可以从那里以任何我想要的方式修改 JSON 字段并更新数据库:
first_row.data['key_2'] = 1
session.commit()
上面的代码有效(因为我们将 JSON 字段标记为可变字典,我们不必手动将其标记为脏)
session.query(MinimalExample.data)\
.filter(MinimalExample.id==1)\
.first()
>>> {'key_0': 1, 'key_2': 1}
但这意味着我必须在本地计算机上查询我想要修改的所有行,这太慢了/我没有足够的内存。
我正在寻找一种方法来使用sqlalchemy.update 函数来获得相同的结果
这是我已经尝试过的:
from sqlalchemy import update
stmt = update(MinimalExample)
.where(MinimalExample.id=1)\
.values(MinimalExample.data={'key_1': 1})
session.execute(stmt)
session.commit()
这只是用字典 {'key_1': 1} 替换我行中的 data 字段
类似的事情似乎是要走的路:
(编辑:找到了一种方法来更正我以前的代码,因此它不再引发错误,只需将对象放入字典中)
stmt = update(MinimalExample)
.where(MinimalExample.id=1)\
.values({MinimalExample.data['key_1']:1})
看这个语句的字符串好像还不错
str(stmt)
>>> 'UPDATE users SET data[:data_1]=:param_1 WHERE users.id = :id_1'
但是执行此语句会导致 ProgrammingError: (MySQLdb._exceptions.ProgrammingError) (1064, 'You have an error in your SQL syntax...
对此有什么想法吗?如果我可以同时更新多行,则可以加分
【问题讨论】:
标签: python mysql sqlalchemy