Я пытаюсь понять, почему этот перенос данных терпит неудачу. Я получаю сообщение об ошибке:
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