Правило зависимости пыталось очистить столбец первичного ключа - PullRequest
0 голосов
/ 04 февраля 2019

Я использую alembic для создания некоторых таблиц:

def upgrade():

    op.create_table(
        'dataset',
        sa.Column('id', sa.VARCHAR(64), primary_key=True),
        sa.Column('language', sa.String(8), nullable=False),
        sa.Column('name', sa.String(64), nullable=False)
    )

    op.create_table(
        'speaker',
        sa.Column('id', sa.VARCHAR(64), primary_key=True),
        sa.Column('dataset_id', sa.VARCHAR(64), nullable=False),
        sa.ForeignKeyConstraint(('dataset_id',), ['dataset.id'], ondelete='cascade')
    )

    op.create_table(
        'text_source',
        sa.Column('id', sa.VARCHAR(64), primary_key=True),
        sa.Column('dataset_id', sa.VARCHAR(64), nullable=False),
        sa.ForeignKeyConstraint(('dataset_id',), ['dataset.id'], ondelete='cascade')
    )

    op.create_table(
        'audio_sample',
        sa.Column('id', sa.VARCHAR(64), primary_key=True),
        sa.Column('speaker_id', sa.VARCHAR(64), primary_key=True),
        sa.Column('text_source_id', sa.VARCHAR(64), primary_key=True),
        sa.ForeignKeyConstraint(('speaker_id',), ['speaker.id'], ondelete='cascade'),
        sa.ForeignKeyConstraint(('text_source_id',), ['text_source.id'], ondelete='cascade')
    )

, и я создал несколько соответствующих классов сущностей:

class DatasetEntity(Base):
    __tablename__ = 'dataset'    
    id = Column(VARCHAR, primary_key=True)

    speakers = relationship('SpeakerEntity')
    text_sources = relationship('TextSourceEntity')


class TextSourceEntity(Base):
    __tablename__ = 'text_source'    
    id = Column(VARCHAR, primary_key=True)
    dataset_id = Column(String, ForeignKey('dataset.id'))

    dataset = relationship('DatasetEntity', back_populates='text_sources')
    audio_samples = relationship('AudioSampleEntity')


class SpeakerEntity(Base):
    __tablename__ = 'speaker'    
    id = Column(String, primary_key=True)
    dataset_id = Column(String, ForeignKey('dataset.id'))

    dataset = relationship('DatasetEntity', back_populates='speakers')
    audio_samples = relationship('AudioSampleEntity')


class AudioSampleEntity(Base):
    __tablename__ = 'audio_sample'    
    id = Column(String, primary_key=True)
    text_source_id = Column(String, ForeignKey('text_source.id'), primary_key=True)
    speaker_id = Column(String, ForeignKey('speaker.id'), primary_key=True)

    speaker = relationship('SpeakerEntity', back_populates='audio_samples')
    text_source = relationship('TextSourceEntity', back_populates='audio_samples')

Когда я пытаюсь запустить скриптдля вставки некоторых данных я получаю:

...
  File "/home/sfalk/miniconda3/envs/t2t/lib/python3.5/site-packages/sqlalchemy/orm/dependency.py", line 571, in process_saves
    state, child, None, True, uowcommit, False
  File "/home/sfalk/miniconda3/envs/t2t/lib/python3.5/site-packages/sqlalchemy/orm/dependency.py", line 591, in _synchronize
    sync.clear(dest, self.mapper, self.prop.synchronize_pairs)
  File "/home/sfalk/miniconda3/envs/t2t/lib/python3.5/site-packages/sqlalchemy/orm/sync.py", line 87, in clear
    "column '%s' on instance '%s'" % (r, orm_util.state_str(dest))
AssertionError: Dependency rule tried to blank-out primary key column 'audio_sample.speaker_id' on instance '<AudioSampleEntity at 0x7f92307ff160>'

, и я не совсем понимаю, что это значит или как понять это.

В каком смысле audio_sample.speaker_id исключает "столбец первичного ключа"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...