我正在使用SQL alchemy在mysql中创建一个表.我希望有一个带有默认值的SON列,但mysql不允许字面量作为默认值,只允许表达.

如果我像这样创建专栏:

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

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

mycolumn JSON DEFAULT '{}'

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

mycolumn JSON DEFAULT ('{}')

我还try 使用json_body():

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说:

只有当值被写入为运算式时,才能为LGA、TEK、GEOMETRY和SON数据类型分配默认值,即使运算式值是字面量.

这意味着您不能将纯文本(没有括号)作为SON列的默认值.您必须使其成为一个表达,即将其放入括号中,因为您找到了作品.括号内的表达可以是简单的文字.


我以这种方式将其用于SQLAchemy中的模型:

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()运算式将按原样呈现,不带引号.

Mysql相关问答推荐

在Join的ON分句中使用SUM()

在联合查询中使用GROUP BY和ORDER BY

优化使用ORDER BY加载耗时较长的MySQL请求

当日期附加到MySQL后,如何按日期说明排序?

MySQL-如何检测时间戳中的一天

为什么歌曲详细信息未显示在 Liked.handlebars 视图中?

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

如何在 MySQL Workbench 中设置 DateTime 列的默认值?

MySQL函数 - 如何对select查询应用多个条件

创建 mySQL BEFORE/AFTER UPDATE 触发器

优化解析 5000 万行 MySQL 表的请求

使用来自另一个表 mysql 的值将新行插入到表中

SQL 根据多行值获取记录

基于 2 列的重复行的 SQL 查询

MySQL Group By 和 Sum 其他列的总值

在 WHERE 子句中使用 CASE

基于字符串动态创建 PHP 对象

在 MySQL 中删除数据库返回删除数据库错误:66

在 Mac 上设置 Laravel php artisan migrate 错误:没有这样的文件或目录

按 15 分钟间隔对 mysql 查询进行分组