我们可以在Mixin或Base类中定义primary_key id列吗?

时间:2019-01-19 22:18:46

标签: python sqlalchemy mixins

这个问题是关于使用继承和BaseMixin类来创建primary_key id并将其提供给每个类的,因此不是一个问题,因此不是标记重复项的重复项。标记的重复项与SQLAlchemy中的Base类有关,但是没有特别针对此列,这是特例。

请参阅下面的水平规则以进行更新。

随着我对Python等的更多了解,我正在寻找降低代码复杂性的方法。

现在,我正在使用Mixin上的重复代码。

我的每个班级都有一个id列。它们始终是相同的:

id = db.Column(db.Integer, primary_key=True)

Mixins and how to implement them上的SQLAlchemy文档从未显示将ID降级为Mixin的示例,但是我不明白为什么这不是一个好主意。 / p>

不应该定义Mixin类的原因是什么?

class IDMixin:
    id = db.Column(db.Integer, primary_key=True)

然后在我的每个模型中继承它?


使用Base

db.Model类替换标准继承对象(Base)的方法甚至更清洁,甚至更干净:

class Base(db.Model):
    __abstract__ = True

    @declared_attr
    def id(cls):
        return db.Column(db.Integer, primary_key=True)

正如@SuperShoot的评论中所建议的那样,我已经做到了这一点,并通过对Mixins上的SQLAlchemy文档的理解得到了补充,但它不起作用。

在开发过程中,每次重建数据库时,我都有预填充数据库的脚本。在纠正错误以解决SQLAlchemy文档中的此建议后:

  

relationship()定义需要显式primaryjoinorder_by等。除了最简单的情况外,表达式在所有参数中都应使用后期绑定形式,即使用字符串形式或一个lambda。

我遇到了以下完全无法理解的追溯:

Traceback (most recent call last):
  File "/home/malan/projects/icc/scripts/../insertenums.py", line 19, in <module>
    db.session.add(classes[key](**entry))
  File "<string>", line 2, in __init__
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/instrumentation.py", line 408, in _new_state_if_none
    state = self._state_constructor(instance, self)
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 839, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/instrumentation.py", line 234, in _state_constructor
    self.dispatch.first_init(self, self.class_)
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/event/attr.py", line 297, in __call__
    fn(*args, **kw)
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/mapper.py", line 3316, in _event_on_first_init
    configure_mappers()
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/mapper.py", line 3204, in configure_mappers
    mapper._post_configure_properties()
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/mapper.py", line 1932, in _post_configure_properties
    prop.init()
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/interfaces.py", line 195, in init
    self.do_init()
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/relationships.py", line 1776, in do_init
    self._process_dependent_arguments()
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/relationships.py", line 1835, in _process_dependent_arguments
    for x in util.to_column_set(self.remote_side)
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/orm/relationships.py", line 1835, in <genexpr>
    for x in util.to_column_set(self.remote_side)
  File "/home/malan/projects/icc/venv/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 4485, in _only_column_elements
    "'%s'; got: '%s', type %s" % (name, element, type(element))
sqlalchemy.exc.ArgumentError: Column-based expression object expected for argument 'remote_side'; got: '<built-in function id>', type <class 'builtin_function_or_method'>

检查MySQL中的表,我注意到id列最终是要声明的最后一个。

我已经看到关系和外键已成功转移到@declared_attr的{​​{1}} s,但{strong> 列中的Mixin primary_key em> 似乎是一个复杂的案例。我的问题是关于 尤其是

是否可以将id primary_key列传输到idMixin模板中,如果可以,此错误怎么办?

我的代码中唯一的区别是,我将每个Base primary_key列放入一个id类中,并在每个模型中都继承了它。该脚本在此之前有效,但现在不起作用。

0 个答案:

没有答案