Base
或Mixin
类来创建primary_key
id并将其提供给每个类的,因此不是一个问题,因此不是标记重复项的重复项。标记的重复项与SQLAlchemy中的Base
类有关,但是没有特别针对此列,这是特例。请参阅下面的水平规则以进行更新。
随着我对Python等的更多了解,我正在寻找降低代码复杂性的方法。
现在,我正在使用Mixin
上的重复代码。
我的每个班级都有一个id
列。它们始终是相同的:
id = db.Column(db.Integer, primary_key=True)
Mixin
s 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()
定义需要显式primaryjoin
,order_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
列传输到id
或Mixin
模板中,如果可以,此错误怎么办?我的代码中唯一的区别是,我将每个Base
primary_key
列放入一个id
类中,并在每个模型中都继承了它。该脚本在此之前有效,但现在不起作用。