我正在使用 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 ('{}')
?
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() 表达式将按原样呈现,不带引号。