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
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

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