python - 父类 SQLAlchemy 中的 UniqueConstraint

标签 python flask sqlalchemy flask-sqlalchemy

我正在尝试通过下一种方式在 Flask-SQLAlchemy 的父类中添加唯一约束。 如您所见,继承以 Joined Table 方式表示。

class Parametric(object, Model):
  __tablename__ = "parametric"
  __mapper_args__ = {'polymorphic_on': type,
                     'polymorphic_identity': 'Parametric'}
  __table_args__ = (
         db.UniqueConstraint('name', 'type', name='name_type'),
     )
  id = Column(db.Integer, primary_key=True)
  name = Column(db.String(32), nullable=False)
  type = Column(db.String(50)) 

  def __init__(self, name):
   self.name = name


class Bar(Parametric):        
  __tablename__ = "bar"
  __mapper_args__ = {'polymorphic_identity': 'Foo'}
  prop = Column(db.String(32), nullable=False)
  id = db.Column(db.Integer, db.ForeignKey('parametric.id'), primary_key=True)

  def __init__(self, name, prop):
   super(Parametric, self).__init__(name=name)
   self.prop = prop

当解释器读取第一个 child 时,我得到下一个回溯:

  File "/usr/local/lib/python2.7/dist-packages/Flask_SQLAlchemy-1.0-py2.7.egg/flask_sqlalchemy/__init__.py", line 510, in __init__
    DeclarativeMeta.__init__(self, name, bases, d)
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/ext/declarative/api.py", line 53, in __init__
    _as_declarative(cls, classname, cls.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/ext/declarative/base.py", line 251, in _as_declarative
    **table_kw)
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/sql/schema.py", line 352, in __new__
    table._init(name, metadata, *args, **kw)
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/sql/schema.py", line 429, in _init
    self._init_items(*args)
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/sql/schema.py", line 72, in _init_items
    item._set_parent_with_dispatch(self)
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/sql/base.py", line 421, in _set_parent_with_dispatch
    self._set_parent(parent)
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/sql/schema.py", line 2272, in _set_parent
    ColumnCollectionMixin._set_parent(self, table)
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/sql/schema.py", line 2240, in _set_parent
    col = table.c[col]
  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.9.4-py2.7-linux-x86_64.egg/sqlalchemy/util/_collections.py", line 156, in __getitem__
    return self._data[key]
KeyError: 'name'

有什么解决办法吗?我的代码有问题吗?

最佳答案

在 SQLAlchemy 中,您可以使用 unique=True 参数指定一个 Column 是唯一的。我认为这将是一种首选的、更易读的做事方式。

我认为您的问题与继承有关,可能与语法有关。

在您的 Parametic 的 __init__() 函数中,您有 name。请注意,name 是一个 arg,而不是 kwarg。不要使用 name=name,只需像这样提交名称:

super(Parametric, self).__init__(name)

关于python - 父类 SQLAlchemy 中的 UniqueConstraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33660318/

相关文章:

python - 如何将子查询结果联接到函数结果

python - SQLalchemy 问题从 MSSQL 列恢复二进制数据

sqlalchemy ORM 调用失败,TypeError : expected bytes, str found

Python 捕获 stdout/stderr 并在查看输出时记录到文件

python - 解析 UTF-8 XML 文件

python - 如何使用 Google Python AppEngine 从 Backbone 应用程序发送电子邮件

python - 我需要在@app.route() 中使用 methods= ['GET' , 'POST' ] 吗?

python - 如何在 Django 中按文件名过滤图像字段

python - 使用 spaCy NLP 的简单 Flask 应用程序间歇性挂起

python - 如何在 Python 中为多个函数重用异常处理代码?