如何在 SQLAlchemy for MYSQL 中将文字转换为表达式?

问题描述 投票:0回答:1

我正在使用 sqlalchemy 在 mysql 中创建一个表。我想要一个带有默认值的 JSON 列,但是 mysql 不允许文字作为默认值,只允许表达式。

如果我创建这样的列:

mycolumn = sqlalchemy.Column(
        MutableDict.as_mutable(mysql.JSON),
        server_default='{}'
    )

sql 查询中创建列的行将如下所示:

mycolumn JSON DEFAULT '{}'

但这不起作用,我需要这个:

mycolumn JSON DEFAULT ('{}')

我也尝试过使用 json_object():

mycolumn = sqlalchemy.Column(
        MutableDict.as_mutable(mysql.JSON),
        server_default=func.json_object('{}', type_=JSON)
    )

但这会产生:

mycolumn JSON DEFAULT json_object()

再说一遍,这行不通

如何将默认值放入表达式中,例如

mycolumn JSON DEFAULT ('{}')

mysql json sqlalchemy default-value
1个回答
0
投票

https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html 说:

仅当将值写入表达式时,才能为 BLOB、TEXT、GEOMETRY 和 JSON 数据类型分配默认值,即使表达式值是文字。

这意味着您不能将纯文字(不带括号)作为 JSON 列的默认值。您必须将其设为一个表达式,即将其放在括号内,就像您找到的作品一样。括号内的表达式可以是简单的文字。


我通过这种方式让它适用于 SQLAlchemy 中的模型:

from sqlalchemy import Table, Column, Integer, String, JSON, text

user_table = Table(
        "user_account",
        meta,
        Column("id", Integer, primary_key=True),
        Column("properties", JSON, server_default=text("('{}')"))
    )

https://docs.sqlalchemy.org/en/20/core/metadata.html#sqlalchemy.schema.Column.params.server_default 说:

text() 表达式将按原样呈现,不带引号。

© www.soinside.com 2019 - 2024. All rights reserved.