×

flask-sqlalchemy中default和server_default

穆琪 穆琪 发表于2019-09-25 21:03:47 浏览1081 评论0

抢沙发发表评论

一、背景

在项目中,遇到了使用flask-sqlalchemy设定字段的默认值的问题,查找文档后发现可以通过设置default来解决,可是设置default后发现只在应用内生效,在navicat的界面中查看sql语句并没有设置。后来使用server_default对字段属性进行了设置。

二、分析

一开始使用的是default

 class Test(db.Model):
     __tablename__ = 'test'
     id = Column(Integer, primary_key=True, autoincrement=True)
     user_name = Column(String(255), nullable=False, comment=u'账号')
     signed_count = Column(Integer, default=0, comment=u'登录次数')

生成后查看navicat:

1.png

我们的目的是限制signed_count这个字段默认为0,但是从SQL语句上来看是设置失败的。

经过查找资料,sqlalchemyColumndefault设置的默认值只能用来约束应用内的使用,如使用:

 new = Test('xxx')
 db.session.add(new)
 db.session.commit()

这样的情况就会默认设置signed_count为0。

可是如果有的人喜欢操作数据库添加用户,那么应用内的逻辑将不起作用,除非在自动生成表的时候改动字段属性。

三、解决方案

后来查看文档,发现可以使用server_default来设置:

 class Test(db.Model):
     __tablename__ = 'test'
     id = Column(Integer, primary_key=True, autoincrement=True)
     user_name = Column(String(255), nullable=False, comment=u'账号')
     signed_count = Column(Integer, server_default=0, comment=u'登录次数')

但是server_default只允许字符串的格式

图片.png


但可以通过使用text的方法来解决:

 from sqlalchemy import text
 class Test(db.Model):
     __tablename__ = 'test'
     id = Column(Integer, primary_key=True, autoincrement=True)
     user_name = Column(String(255), nullable=False, comment=u'账号')
     signed_count = Column(Integer, server_default=text('0'), comment=u'登录次数')

生成后查看navicat:

3.png


此时生成数据库的SQL语句也已经设为了默认值为0。