一、背景
在项目中,遇到了使用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:
我们的目的是限制signed_count
这个字段默认为0,但是从SQL语句上来看是设置失败的。
经过查找资料,sqlalchemy
的Column
的default
设置的默认值只能用来约束应用内的使用,如使用:
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
只允许字符串的格式
但可以通过使用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:
此时生成数据库的SQL语句也已经设为了默认值为0。