引出问题:在做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了,查看表结构发现默认值有效。