alembi c миграция данных - неожиданный ноль в первичном ключе - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь понять, почему этот перенос данных терпит неудачу. Я получаю сообщение об ошибке:

sqlalchemy.orm.ex c .FlushError: не удается обновить таблицу counting_events, используя NULL для значения первичного ключа в столбце counting_events.guild_id

, но это поле определенно не должно быть нулевым.

Функция обновления указана ниже вместе с классом. Как видите, я добавил поле, которое теперь является частью первичного ключа (и является внешним ключом для другой таблицы). Я пытаюсь установить начальное значение для этих объектов в базе данных, и операторы печати правильно показывают, что оно установлено. Однако когда при обновлении вызывается session.commit (), он выдает ошибку sh с указанной выше ошибкой. Я всю жизнь не могу понять, почему он может подумать, что это null ... Я прочитал пару руководств, и никто другой не делает именно то, что я делаю, но я думал, что успешно объединил все знания ...

class CountingEvent(BASE):
    __tablename__ = "counting_events"
    id = Column(Integer, primary_key=True)
    guild_id = Column(BigInteger, ForeignKey("guilds.discord_id"), primary_key=True)
    name = Column(String)
    count_name = Column(String)
    comments = Column(String)
    creator_id = Column(BigInteger)
    creator_guild_id = Column(BigInteger)
    creator = relationship("Member")
    members = relationship("Member", secondary="member_counts_in_event")
    status = Column(String)
    countables: List = relationship("Countable", "countables_on_event")
    __table_args__ = (
        ForeignKeyConstraint(
            [creator_id, creator_guild_id], [Member.discord_id, Member.guild_id]
        ),
    )


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###



    op.add_column('countables', sa.Column('guild_id', sa.BigInteger(), nullable=False))
    op.create_foreign_key(op.f('fk_countables_guild_id_guilds'), 'countables', 'guilds', ['guild_id'], ['discord_id'])
    op.add_column('countables_on_event', sa.Column('countable_guild_id', sa.BigInteger(), nullable=False))
    op.add_column('countables_on_event', sa.Column('event_guild_id', sa.BigInteger(), nullable=False))
    op.drop_constraint('fk_countables_on_event_event_id_counting_events', 'countables_on_event', type_='foreignkey')
    op.drop_constraint('fk_countables_on_event_countable_id_countables', 'countables_on_event', type_='foreignkey')


    op.add_column('counting_events', sa.Column('guild_id', sa.BigInteger(), nullable=True))

    #trying to handle nullable guild_id's
    bind = op.get_bind()
    session = orm.Session(bind=bind)
    counting_events : List[CountingEvent] = session.query(CountingEvent).all()
    for ce in counting_events:
        print(ce.creator_guild_id)
        ce.guild_id = ce.creator_guild_id
    for ce in counting_events:
        print(ce.guild_id)
    print("committing")
    session.commit()
    print("commited")
    # Session.remove()
    # print("done")

    op.alter_column('counting_events', 'guild_id', nullable=False)


    op.create_foreign_key(op.f('fk_countables_on_event_event_id_counting_events'), 'countables_on_event', 'counting_events', ['event_id', 'event_guild_id'], ['id', 'guild_id'])
    op.create_foreign_key(op.f('fk_countables_on_event_countable_id_countables'), 'countables_on_event', 'countables', ['countable_id', 'countable_guild_id'], ['id', 'guild_id'])
    op.create_foreign_key(op.f('fk_counting_events_guild_id_guilds'), 'counting_events', 'guilds', ['guild_id'], ['discord_id'])
    op.add_column('member_counts_in_event', sa.Column('countable_guild_id', sa.BigInteger(), nullable=False))
    op.add_column('member_counts_in_event', sa.Column('event_guild_id', sa.BigInteger(), nullable=False))
    op.drop_constraint('fk_member_counts_in_event_countable_id_countables', 'member_counts_in_event', type_='foreignkey')
    op.drop_constraint('fk_member_counts_in_event_guild_id_guilds', 'member_counts_in_event', type_='foreignkey')
    op.drop_constraint('fk_member_counts_in_event_event_id_counting_events', 'member_counts_in_event', type_='foreignkey')
    op.create_foreign_key(op.f('fk_member_counts_in_event_event_id_counting_events'), 'member_counts_in_event', 'counting_events', ['event_id', 'event_guild_id'], ['id', 'guild_id'])
    op.create_foreign_key(op.f('fk_member_counts_in_event_countable_id_countables'), 'member_counts_in_event', 'countables', ['countable_id', 'countable_guild_id'], ['id', 'guild_id'])
    op.drop_column('member_counts_in_event', 'guild_id')
    op.drop_column('member_counts_in_event', 'countable_name')

(redstar_dev) λ alembic upgrade +1
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade dafb85ebb76f -> b76fdc0a034d, cross server revision
624071266122596357
624071266122596357
624071266122596357
624071266122596357
624071266122596357
624071266122596357
committing
Traceback (most recent call last):
  File "C:\Users\ben\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Users\ben\AppData\Local\Programs\Python\Python37-32\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\ben\.virtualenvs\redstar_dev\Scripts\alembic.exe\__main__.py", line 7, in <module>
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\config.py", line 577, in main
    CommandLine(prog=prog).main(argv=argv)
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\config.py", line 571, in main
    self.run_cmd(cfg, options)
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\config.py", line 551, in run_cmd
    **dict((k, getattr(options, k, None)) for k in kwarg)
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\command.py", line 298, in upgrade
    script.run_env()
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\script\base.py", line 489, in run_env
    util.load_python_file(self.dir, "env.py")
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\util\pyfiles.py", line 98, in load_python_file
    module = load_module_py(module_id, path)
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\util\compat.py", line 184, in load_module_py
    spec.loader.exec_module(module)
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "alembic\env.py", line 82, in <module>
    run_migrations_online()
  File "alembic\env.py", line 76, in run_migrations_online
    context.run_migrations()
  File "<string>", line 8, in run_migrations
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\runtime\environment.py", line 846, in run_migrations
    self.get_context().run_migrations(**kw)
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\alembic\runtime\migration.py", line 520, in run_migrations
    step.migration_fn(**kw)
  File "D:\Users\ben\Documents\discord_bots\redstar_dev\alembic\versions\b76fdc0a034d_cross_server_revision.py", line 280, in upgrade
    session.commit()
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\session.py", line 1036, in commit
    self.transaction.commit()
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\session.py", line 503, in commit
    self._prepare_impl()
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\session.py", line 482, in _prepare_impl
    self.session.flush()
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\session.py", line 2496, in flush
    self._flush(objects)
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\session.py", line 2637, in _flush
    transaction.rollback(_capture_exception=True)
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\util\langhelpers.py", line 69, in __exit__
    exc_value, with_traceback=exc_tb,
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\util\compat.py", line 178, in raise_
    raise exception
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\session.py", line 2597, in _flush
    flush_context.execute()
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 422, in execute
    rec.execute(self)
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 589, in execute
    uow,
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\persistence.py", line 236, in save_obj
    update,
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\persistence.py", line 890, in _emit_update_statements
    lambda rec: (
  File "c:\users\ben\.virtualenvs\redstar_dev\lib\site-packages\sqlalchemy\orm\persistence.py", line 718, in _collect_update_commands
    "key value on column %s" % (table, col)
sqlalchemy.orm.exc.FlushError: Can't update table counting_events using NULL for primary key value on column counting_events.guild_id
...