default和server_default的区别

引出问题:在做flask web的项目中,创建的模型类在连接数据库的时候会遇见一个问题

status = db.Column(db.Integer, nullable=False, default=0) # 托盘状态。0:正常 1:停用

这样nullable和default设置之后,我们在数据库看到的数据确实对于默认值生效了,但是数据库的表结构的默认值修改了,

(数据库的默认值已修改)

mysql> select * from trays ;
+----+------------+----------+--------+---------------------+---------------------+---------------------+
| id | name       | channels | status | updated_at          | deleted_at          | created_at          |
+----+------------+----------+--------+---------------------+---------------------+---------------------+
|  1 | 托盘00     |       48 |      0 | 2022-07-18 11:40:59 | NULL                | 2022-07-18 11:40:59 |
|  2 | 托盘00     |       60 |      0 | 2022-07-18 11:41:24 | NULL                | 2022-07-18 11:41:24 |
|  3 | 托盘00     |       60 |      0 | 2022-07-18 11:43:12 | NULL                | 2022-07-18 11:43:12 |

数据库的表结构没有发生变化:

mysql> desc trays;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int          | NO   | PRI | NULL    | auto_increment |
| name       | varchar(100) | NO   |     | NULL    |                |
| channels   | int          | NO   |     | NULL    |                |
| status     | int          | NO   |     | NULL    |                |
| updated_at | timestamp    | YES  |     | NULL    |                |
| deleted_at | timestamp    | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

然后通过两种插入数据:1.可视化用表的方式插入,2.以sql语句的方式插入,发现插入后的default是NULL。
原因:这是因为我们在执行db相关命令的时候,sqlalchemy自动给我们添加上的。所以我们看到的是表结构通过sqlalchemy自动给我我们加上的,但是本质上表结构没有。

解决方法:将default 换成 server_default

status = db.Column(db.Integer, nullable=False, server_default=0) # 状态。0:正常 1:停用

新问题:重来一遍,发现仍然抱错,查询之后是因为server_default只接受字符串的类型的值,并不接受整形和布尔类型的值,

sqlalchemy.exc.ArgumentError: Argument 'arg' is expected to be one of type '<class 'str'> ,not <class 'int'>.....

解决方法:

1.先导包

from sqlalchemy import text

2.status = db.Column(db.Integer, nullable=False, server_default=text('0')) # 状态。0:正常 1:停用

3.按照上面的格式用text()函数转化一下就ok了,查看表结构发现默认值有效。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值