我回来了另一个SQL Alchemy问题。
因此,我在两个类(数据集和列)之间存在多对多关系(忽略明显的可怕名称)。
我以前使用的是关联表,并且一切正常。但是我现在需要在该关联表中添加一个额外的列,因此我不得不将该表转换为对象。
我正在关注文档,但我不断收到此错误:
AssertionError: Attribute 'datasets' on class '<class 'test_models.Table'>' doesn't handle objects of type '<class 'test_models.Dataset'>'
class Dataset(BASE):
__tablename__ = 'dataset'
dataset_id = Column(INTEGER(10), primary_key=True, unique=True, nullable=False)
dataset_name = Column(Text, nullable=False)
dataset_title = Column(Text)
dataset_comment = Column(Text)
tables = relationship('Dataset_Table',
back_populates='datasets')
class Table(BASE):
__tablename__ = 'table'
table_id = Column(INTEGER(11), primary_key=True, unique=True, nullable=False)
table_name = Column(Text, nullable=False)
table_group = Column(Text)
table_description = Column(Text)
table_longitudinal = Column(Enum('S', 'Y', 'N', 'L'))
datasets = relationship('Dataset_Table',
back_populates='tables')
这是指向完整堆栈跟踪的链接:https://pastebin.com/NHgLCWq6
我的方法不正确吗?我究竟做错了什么?我只是希望我的多对多表可以像以前一样使用关联表,但是可以使用关联对象
编辑:
抱歉,我没有包含将上述两个表链接在一起的关联表:
class Dataset_Table(BASE):
__tablename__ = 'dataset_table'
id = Column('id', INTEGER, primary_key=True, unique=True, nullable=False)
dataset_id = Column('dataset_id', INTEGER, ForeignKey('dataset.dataset_id'), nullable=False)
table_id = Column('table_id', INTEGER, ForeignKey('table.table_id'), nullable=False)
position = Column(INTEGER, nullable=False)
datasets = relationship('Dataset',
back_populates='tables')
tables = relationship('Table',
back_populates='datasets')
如您所见,这是标准的多对多人口,like this
我将完整的堆栈跟踪放在下面:
Traceback (most recent call last):
File "/Users/kevin.dasilva/SQL_tings/SQL_ingest.py", line 103, in <module>
sess.add_all(objs)
File "/Users/kevin.dasilva/SQL_tings/SQL_env/lib/python3.6/site-
packages/sqlalchemy/orm/session.py", line 1785, in add_all
self.add(instance, _warn=False)
File "/Users/kevin.dasilva/SQL_tings/SQL_env/lib/python3.6/site-
packages/sqlalchemy/orm/session.py", line 1776, in add
self._save_or_update_state(state)
File "/Users/kevin.dasilva/SQL_tings/SQL_env/lib/python3.6/site-
packages/sqlalchemy/orm/session.py", line 1795, in
_save_or_update_state
halt_on=self._contains_state):
File "/Users/kevin.dasilva/SQL_tings/SQL_env/lib/python3.6/site-
packages/sqlalchemy/orm/mapper.py", line 2870, in cascade_iterator
visited_states, halt_on))
File "/Users/kevin.dasilva/SQL_tings/SQL_env/lib/python3.6/site-
packages/sqlalchemy/orm/relationships.py", line 1591, in
cascade_iterator
c.__class__
AssertionError: Attribute 'datasets' on class '<class
'test_models.Table'>' doesn't handle objects of type '<class
'test_models.Dataset'>'
编辑:
我相信我正在搜索具有关联对象的“双向多对多”