sqlalchemy 在数据库端设置字段的默认值

我们通过sqlalchemy定义模型创建的数据库表,通常会通过ORM的方式操作,但在开发的过程中难免也会遇到不通过ORM而直接操作数据库的情况。这时我们在定义模型时,给字段设置的默认值就不能安装以前的方法了,这里有些坑我先踩过了,在此记录一下已便他人查阅。

比如我们现在想创建一张user表,根据需求几个字段的默认值设置如下:

  • is_vip字段设置默认值为0
  • create_time字段默认值设置为该行插入的时间
  • update_time字段能够在该行改变时自动更新时间

通常我们会这样创建user表:

from sqlalchemy import Column, String, create_engine, Integer, DateTime
from sqlalchemy.sql import func
from sqlalchemy.ext.declarative import declarative_base


# 创建对象的基类:
Base = declarative_base()

class User(Base):
    __tablename__ = 'user'

    id = Column(String(36), primary_key=True)
    name = Column(String(20))
    is_vip = Column(Integer, default=0)
    create_time = Column(DateTime, nullable=False, default=datetime.datetime.now)
    update_time = Column(DateTime, nullable=False, onupdate=True)
   

# 初始化数据库连接:
engine = create_engine('mysql+pymysql://root:111111@localhost:3306/testdb')
Base.metadata.create_all(engine)

看起来一切都那么完美,没有任何问题,但是我们查看一下生成的DDL:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `is_vip` int(11) DEFAULT NULL,
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

默认值和自动更新都没有设置成功,想要默认值和自动更新生效就只能通过ORM操作数据库。那该怎么办呢?下面揭晓正确的操作姿势。

from sqlalchemy import Column, String, Integer, DateTime, TIMESTAMP
from sqlalchemy.sql import func


class User1(Base):
    # 表的名字:
    __tablename__ = 'user1'

    id = Column(Integer, primary_key=True)
    name = Column(String(20))
    # 数据库设置默认值 需是字符串
    is_vip = Column(Integer, server_default='0')
    # 默认值是创建时间 不自动更新
    create_time = Column(DateTime, nullable=False, server_default=func.now())
    # 自动更新 需要设置nullable=False
    update_time = Column(TIMESTAMP, nullable=False)

使用server_default在数据库中直接生成默认值,需要注意的是Integer默认值不能直接设置数字,需要是字符串;DateTime默认值需要使用func.now();自动更新的时间戳可以使用TIMESTAMP,只需设置nullable=False即可
下面是生成的DDL:

CREATE TABLE `user1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `is_vip` int(11) DEFAULT '0',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,954评论 6 342
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,797评论 0 44
  • 门内一颗心厅堂温馨厨房菜飘香 门外一个人风里来雨里去迎风带雨外乡 看看厅堂闻闻菜香生活无奈可尝时光静美
    蒋光头jL94430阅读 1,304评论 35 47
  • 晚上吃过晚饭,老头老太太和我,我们仨有一搭没一搭的在火炕上聊天,老头在躺着敷麸皮醋包,我在教老太太用新买的可以和广...
    花手鞠阅读 200评论 2 0