【问题标题】:SQLAlchemy set default nullable=FalseSQLAlchemy 设置默认 nullable=False
【发布时间】:2022-04-06 06:39:50
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 默认是nullable=True,我查过了。
  • 就因为这个来来回回,我查了源码。默认为 nullable=True 除非该列用作主键列,在这种情况下默认为 nullable=False

标签: python sqlalchemy flask-sqlalchemy


【解决方案1】:

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

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

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

按照 cmets 中的建议使用 functools.partial

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

【讨论】:

  • 使用 functools.partial 代替。
  • @PedroWerneck 我不反对......但现在只是想保持简单:P(虽然现在我添加了它......这非常简单)
  • functools.partial 在 Python 3.6+ 中搞乱了类型推断。您需要 from typing import Type; NullColumn : Type[Column] = partial(Column, nullable=True) 进行 lint 和/或自动完成以继续工作,或者只使用简单版本。
【解决方案2】:

由于Column 是一个类,所以子类化对我来说似乎更具可扩展性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 类。它只是由 flask-sqlalchemy 与其他 SQLAlchemy 定义一起导入的,因此库用户不需要从不同的地方导入。那时只需要一个导入。


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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-14
      • 2010-11-27
      • 2017-01-18
      • 2019-06-21
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2016-12-22
      相关资源
      最近更新 更多