SQLAlchemy 设置默认 nullable=False

问题描述 投票:0回答:3

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

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

提前致谢。

python sqlalchemy flask-sqlalchemy
3个回答
37
投票

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

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)

4
投票

由于

Column
是一个类,因此根据您的用例,子类化可能更具可扩展性。

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

另请注意,如果未设置,接受的答案会将

nullable
设置为
True
。正确的是
False


3
投票

接受的答案为名为

nullable = True
NullColumn
列创建一个包装器,这已经是
Column
默认执行的操作。该问题要求在创建列时将
nullable = False
(不是
True
)设置为默认值。

from sqlalchemy import Column as Col

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

此函数默认返回带有

Column
nullable = False
,如果需要,也可以用
nullable = True
覆盖(与
functools.partial
解决方案不同)。

© www.soinside.com 2019 - 2024. All rights reserved.