SQLAlchemy设置默认nullable = False

Joh*_*son 11 python sqlalchemy flask-sqlalchemy

我正在使用SQLAlchemy for Flask来创建一些模型.问题是,我的几乎所有列都需要nullable=False,所以我正在寻找一种在创建列时将此选项设置为默认值的方法.当然我可以手动添加它们(作为Vim练习),但我今天感觉不舒服.作为参考,这是我的setup(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)
Run Code Online (Sandbox Code Playgroud)

还有很多.有一个简单的方法吗?

提前致谢.

Jor*_*ley 23

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

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

...
username = NullColumn(db.String(80))
Run Code Online (Sandbox Code Playgroud)

functools.partial按照评论中的建议使用

from functools import partial
NullColumn = partial(Column,nullable=True)
Run Code Online (Sandbox Code Playgroud)

  • 请改用functools.partial. (9认同)
  • `functools.partial` 在 Python 3.6+ 中搞乱了类型推断。你需要`从输入导入类型; NullColumn : Type[Column] = partial(Column, nullable=True)` 用于 lint 和/或自动完成以继续工作,或者只使用简单版本。 (5认同)

Mai*_*cio 6

Column类一样,子类化可能更具可扩展性,具体取决于您的用例。

from sqlalchemy import Column as Col
    
class Column(Col):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('nullable', False)
        super().__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

另请注意,如果未设置,则接受的答案将设置为nullableTrue正确的是False.