SQLAlchemy设置默认nullable = False

时间:2015-04-08 18:28:18

标签: python sqlalchemy flask-sqlalchemy

我使用SQLAlchemy for Flask来创建一些模型。问题是,我的几乎所有列都需要nullable=False,所以我在寻找一种在创建列时将此选项设置为默认值的方法。当然我可以手动添加它们(作为Vim练习),但我今天感觉不舒服。作为参考,这是我的设置(models.py)的样子:

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     username = db.Column(db.String(80), nullable=False)

还有更多。有一种简单的方法吗?

提前致谢。

2 个答案:

答案 0 :(得分:20)

只需创建一个设置它的包装器

def NullColumn(*args,**kwargs):
    kwargs["nullable"] = kwargs.get("nullable",True)
    return db.Column(*args,**kwargs)

...
username = NullColumn(db.String(80))

使用评论中建议的functools.partial

from functools import partial
NullColumn = partial(Column,nullable=True)

答案 1 :(得分:0)

由于 Column 是一个类,子类化对我来说似乎更具扩展性1。根据您使用的 IDE,代码完成功能可能仍然有效。

from functools import wraps
from sqlalchemy.sql.schema import Column as SAColumn


class Column(SAColumn):
    @wraps(SAColumn.__init__)
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('nullable', False)
        super().__init__(*args, **kwargs)
<子> db.Column 是 SQLAlchemy 的 Column 类。它只是由flask-sqlalchemy 与其他SQLAlchemy 定义一起导入,因此库用户不需要从不同的地方导入。那时只需要一个导入。


1 可以在实例化后直接设置属性,例如 self.nullable