SQLAlchemy 设置默认 nullable=False

SQLAlchemy set default nullable=False

我正在使用 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)

还有更多。有没有简单的方法可以做到这一点?

提前致谢。

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

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)

因为 Column 是一个 class,subclassing 对我来说似乎更具可扩展性 1。根据您使用的 IDE,代码完成可能仍然可以使用变量和关键字参数。

from sqlalchemy.sql.schema import Column as SAColumn
    
class Column(SAColumn):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('nullable', False)
        super().__init__(*args, **kwargs)
db.Column 是 SQLAlchemy 的 Column class。它只是由 flask-sqlalchemy 与其他 SQLAlchemy 定义一起导入,因此库用户不需要从不同的地方导入。那么只需要一次导入。


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

接受的答案为名为 NullColumnnullable = True 列创建了一个包装器,这已经是 Column 默认情况下所做的。该问题要求在创建列时将 nullable = False(而不是 True)设置为默认值。

from sqlalchemy import Column as Col

def Column(*args, **kwargs):
    kwargs.setdefault('nullable', False)
    return Col(*args, **kwargs)

此函数 returns 默认为 Columnnullable = False,如果需要也可以用 nullable = True 覆盖(与 functools.partial 解决方案不同) .