当前位置: 首页 > 面试题库 >

在SQLAlchemy中,字典更新方法如何与ORM交互?

漆雕博
2023-03-14
问题内容

所以我有一个带有JSON列的SQLAlchemy表:

from sqlalchemy.dialects.postgresql import JSON
class MyTable(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    my_json_column = db.Column(JSON)

我尝试使用如下dict#update方法更新该列:

def foo(my_object, new_params):
    my_object.my_json_column.update(new_params)
    db.session.commit()

但是,那没有用。编辑: 我的意思是,更新没有持久保存到数据库中。

起作用的是:

def foo(my_object, new_params):
    temp_params = my_object.my_json_column.copy()
    temp_params.update(new_params)
    my_object.my_json_column = new_params
    db.session.commit()

我怀疑这与“不变性”有关,或者ORM仅注意到直接分配的更改等。有谁知道为什么吗?


问题答案:

是。默认情况下,SQLAlchemy不跟踪属性 内部的
更改dict。要使其跟踪更改,可以使用mutable扩展名:

class MyTable(db.Model):
    ...
    my_json_column = db.Column(MutableDict.as_mutable(JSON))


 类似资料:
  • 有人有做这事的经验吗? 更新: 我要添加的数据是一个字典的python列表:

  • 问题内容: CREATE TABLE foo ( name text NOT NULL, deleted_at timestamp without time zone ); 当我尝试使用ORM执行此操作时,我最终遇到此错误 我想使用ORM,以便在更新命令完成之前使用更改来更新会话。 问题答案: 使用ORM发行多表更新的方法如下: Query API 文档中的脚注,用于指向Core多表更新文档的更新

  • 问题内容: 我收到一个字典作为输入,并想返回一个字典,其键将是输入的值,而其值将是对应的输入键。价值观是独一无二的。 例如,说我的输入是: 我希望我的输出是: 为了澄清,我希望我的结果等于以下内容: 有什么精巧的Pythonic方式可以做到这一点? 问题答案: Python 2: Python 3(感谢@erik):

  • 问题内容: 我有一本代表书店的字典。键代表书名,值代表当前书的份数。从商店出售书籍时,书籍的份数必须减少。 我已经编写了减少售书数量的代码,但是在更新后打印字典时,我得到的是初始字典,而不是更新的字典。 我想以最简单的方式解决问题。我是否错过了代码中的任何逻辑或任何行? 问题答案: 好吧,您可以仅通过引用键直接从值中减去。我认为这更简单。 在您的情况下:

  • 问题内容: 我正在启动一个新应用程序,并考虑使用ORM,尤其是SQLAlchemy。 假设我的数据库中有一列“ foo”,我想增加它。在直通sqlite中,这很容易: 我弄清楚了SQLAlchemy SQL-builder等效项: 这稍微慢一点,但是没有太多。 这是我对SQLAlchemy ORM方法的最佳猜测: 这样做是正确的,但所需的时间是其他两种方法的不到50倍。我认为这是因为它必须先将所有

  • 行动时刻 - 更新MikroTik词典 Isaac给他的朋友发了电子邮件,通知他有关配置损坏的信息。 然后他的朋友回复并指示Isaac访问以下URL,其中显示了MikroTik支持的最新RADIUS属性: http://wiki.mikrotik.com/wiki/Manual:RADIUS_Client 虽然网页的内容最初有点令人困惑,但Isaac设法执行以下操作以修复其FreeRADIUS服务