在使用SQLAlchemy的业务中设置的更新时间的server_default不生效时查找原因做了以下测试:

  1. default与server_default同时设置时,default优先级高于server_default。(参考图中time_both_default字段,该字段生效的是default的utc日期字段,即表中数据为8:07,而不是数据库中默认的本地时间即16:07)
  2. default走SQLAlchemy的Python程序,打印出SQL语句的话,相当于向数据库表中该字段插入了default设置的默认值;(参考图中所有设置了default值的字段:int_default、bool_default、time_default、time_both_default,最终入库值均为default的设置值,并且在insert的sql语句中均有体现)
  3. 而设置了server_default则走MySQL表结构中设置的DEFAULT值,打印SQL语句的话,相当于插入时没有插入该字段;(参考图中bool_server_default,值为0,对应insert的sql语句中没有该字段,time_server_default值为数据库默认的本地时间16:07)
  4. 而如果既不设置default也不设置server_default时,如果该字段不给定值,打印SQL语句的话,那么相当于默认该字段插入了None/Null值,数据库中设置的DEFAULT不生效;(参考图中time_not_default字段,SQL语句插入了None值,数据库DEFAULT默认本地时间失效,值为Null)
  5. 而如果sever_default默认值与数据库DEFAULT默认值不一致时,以数据库danDEFALUT值为准,参考第3条,因为此时没有插入该字段,即SQLAlchemy的server_default失效。(参考图中int_server_default,数据库中默认值为NULL,SQLAlchemy模型设置为9,结果为null)

一张图说明以上5点

测试用代码:

#!/usr/bin/env python3
# -*- coding=utf-8 -*-"""
SQLAlchemy Column对象default与server_default区别。
"""
from datetime import datetimefrom sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import text, Column, Integer, String, Boolean, DateTime
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engineBase = declarative_base()class ColumnDefaultTest(Base):__tablename__ = 'column_default_test'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(255), comment='名称')int_default = Column(Integer, default=10, comment='SQLAlchemy默认')int_server_default = Column(Integer, server_default=text("9"), comment='数据库默认')bool_default = Column(Boolean, default=1, comment='SQLAlchemy默认')bool_server_default = Column(Boolean, server_default=text("0"), comment='数据库默认')time_default = Column(DateTime, default=datetime.utcnow, comment='SQLAlchemy默认')time_not_default = Column(DateTime, comment='不设置默认值')time_server_default = Column(DateTime, server_default=text('CURRENT_TIMESTAMP'), comment='SQLAlchemy默认')time_both_default = Column(DateTime, default=datetime.utcnow, server_default=text('CURRENT_TIMESTAMP'), comment='同时默认')# engine = create_engine('sqlite:///test_default.db', echo=True)
# Base.metadata.create_all(engine)engine = create_engine('mysql+mysqldb://user:password@127.0.0.1:3306/data_base?charset=utf8mb4', echo=True)
session = sessionmaker(bind=engine)
db = session()
result = db.query(ColumnDefaultTest).all()
print(result)insert_test = ColumnDefaultTest(name='默认值测试')
db.add(insert_test)
db.commit()

SQL建表语句:

CREATE TABLE `column_default_test` (`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(255) DEFAULT NULL COMMENT '名称',`int_default` int DEFAULT NULL COMMENT 'SQLAlchemy默认',`int_server_default` int DEFAULT NULL COMMENT '数据库默认',`bool_default` tinyint DEFAULT NULL COMMENT 'SQLAlchemy默认',`bool_server_default` tinyint DEFAULT 0 COMMENT '数据库默认',`time_default` datetime DEFAULT NULL COMMENT 'SQLAlchemy默认',`time_not_default` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'SQLAlchemy不设置默认值而数据库设置',`time_server_default` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '数据库默认',`time_both_default` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'SQLAlchemy与数据库同时设置默认',PRIMARY KEY (`id`)
) ENGINE=InnoDB;

SQLAlchemy Column对象中的default与server_default区别相关推荐

  1. java 中 public,default,protected,private区别

    对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友. 1. public :对 所有用户 开放,所有用户都可直接调用 ...

  2. Window对象中setInterval()和setTimeout()的区别

    - setInterval("",time):每隔指定的时间执行一次调用的函数或计算表达式,如果不停止会无限次去执行: - setTimeout("",time ...

  3. Out对象中clear()和clearBuffer()的区别

    public abstract void clearBuffer() :清除缓冲区的数据,如果在flush之后调用不会抛出异常. public abstract void clear() :清除缓冲区 ...

  4. Flask框架(SQLAlchemy(python3版本)中查询数据的方法,以及定义显示信息 )

    (SQLAlchemy中添加数据 )https://blog.csdn.net/wei18791957243/article/details/85256848      添加数据,添加好的表     ...

  5. SQLAlchemy - Column详解

    SQLAlchemy - Column详解 Column常用参数: default:默认值 nullable:是否可有 primary_key:是否为主键 unique:是否唯一 autoincrem ...

  6. 如何将一个对象中的List对象添加为子集,且父结构不存在重复数据

    如何将一个对象中的List对象添加为子集,且父结构不存在重复数据 有这样一个需求,把一个客户名下的联系人构建成下拉树结构.如 : A公司 ----联系人:张三 ----联系人:李四 B公司 ----联 ...

  7. 「后端小伙伴来学前端了」Vue中 this.$set的用法 | 可用于修改对象中数组的某一个对象、 可用于更新数据到视图

    夜晚有明月,梦里有佳人 前言 最近在写老师布置的vue项目,真的说实话,每天真就是在百度.google.bing等各个搜索引擎之间反复横跳,不然就是掘金搜一搜.思否搜一搜,还有CSDN看一看.我的前端 ...

  8. 在SQL中使用DEFAULT约束

    DEFAULT constraint is used to insert default value into a column on a table and if no any value is s ...

  9. sqlalchemy mysql配置中怎么设置utf8_在SqlAlchemy中,我想要一个列是UTF8?

    我注意到我的MySQL数据库在默认情况下没有设置为UTF-8.改为选择latin1_swedish_ci排序规则.在 所以我很自然地遇到了一个用户报告的错误,我的应用程序不支持特殊字符.我去确保我的应 ...

最新文章

  1. HDU 2444:The Accomodation of Students(二分图判定+匹配)
  2. oauth基本流程和原理
  3. 开发经常犯的错误之→【join表连接关联查询 】
  4. 091115 T UI生成的类
  5. 配置csrf_django 入门第一课 配置文件
  6. 以色列政府网站遭史上规模最大的DDoS 攻击
  7. 使用 MonoGame* 开发游戏
  8. c 和java用cfb_一文彻底搞懂Java中的环境变量
  9. 简单之美 | ZooKeeper应用案例
  10. 如何搜索视频和字幕?
  11. SpringBoot - Spring 家族的技术体系
  12. php5.6.40 在 win10下安装全过程 ( 图文教程、附官方下载链接 )
  13. C语言大数阶乘取余,python中math模块常用函数介绍 取模(取余)取绝对值 求阶乘 求最大公约数最小公倍数 取对数 取根号 取幂(取次方) 取整函数 三角函数与反三角函数...
  14. 基于Vue3实现扫码枪扫码并生成二维码的代码解析
  15. ubuntu18批量解压和删除压缩包以及文件夹操作
  16. 计算机条件函数ppt,EXCEL常用函数教程PPT讲课课件_计算机硬件及应用_IT/计算机_资料(2)...
  17. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一
  18. RK3588 rtc-hym8563设备开发
  19. PyCharm2019 激活方式
  20. Filenet与彼岸花资本、加密资本、青松资本达成战略合作

热门文章

  1. D5周报|第8期:D5画质优化版本即将上线;3Ds Max 工作流插件重构内测、Revit 工作流教程
  2. 设置html前导符,或要在制表符前插入特定字符(前导符)
  3. SpringMVC(8) 模拟邮件验证实现注册登录
  4. Python 库安装
  5. python数组降序排序_python-如何按降序对2d数组的一半进行排序(numpy)
  6. Shell 脚本打印最终执行脚本内容
  7. (七)深度学习实战 | MMDetection笔记(4)
  8. 【从入门到实践】数据挖掘系统知识-附Python实现代码
  9. 微信小程序实例--洗衣小程序开发经验分享
  10. 2023 导航网站发布页单页html自适应源码 无后台