多对多关联对象SQLAlchemy问题

时间:2018-11-12 22:45:35

标签: python sqlalchemy

我回来了另一个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'>'

编辑:

我相信我正在搜索具有关联对象的“双向多对多”

0 个答案:

没有答案