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;



作者:__robin
链接:https://www.jianshu.com/p/6d3ec5851f3a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章