Почему alembic не создает миграцию в моделях sqlalchemy?
Есть три модели с некоторыми связями между собой.
Модели
class Clinic(Base): '''Таблица клиники''' id = Column(Integer, primary_key=True, index=True) title = Column(String, index=True, nullable=False, comment="Наименование") website = Column(String, comment="Веб-сайт") phone = Column(String(21), comment="Телефон") address = Column(String(500), comment="Адрес") logo = Column(String(200), comment="Логотип") start_time = Column(Time, comment="Начало рабочего дня") end_time = Column(Time, comment="Конец рабочего дня") rate_id = Column(Integer, ForeignKey("rate.id")) users = relationship("User", back_populates="clinic") rate = relationship("Rate", back_populates="clinics") class Rate(Base): '''Таблица с тарифами''' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), unique=True, nullable=False, comment="Наименование") price = Column(Integer, nullable=False, comment="Стомость") is_active = Column(Boolean, default=True, comment="Активный") clinics = relationship("Clinic", back_populates="rate") class User(Base): '''Модель пользователя''' id = Column(Integer, primary_key=True, index=True) first_name = Column(String, index=True) last_name = Column(String, index=True) patronymic = Column(String, index=True) birthday = Column(Date) image = Column(String, nullable=True) email = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=False) is_active = Column(Boolean(), default=True) is_superuser = Column(Boolean(), default=False) clinic_id = Column(Integer, ForeignKey('clinic.id')) clinic = relationship("Clinic", back_populates="users") |
class Clinic(Base): '''Таблица клиники''' id = Column(Integer, primary_key=True, index=True) title = Column(String, index=True, nullable=False, comment="Наименование") website = Column(String, comment="Веб-сайт") phone = Column(String(21), comment="Телефон") address = Column(String(500), comment="Адрес") logo = Column(String(200), comment="Логотип") start_time = Column(Time, comment="Начало рабочего дня") end_time = Column(Time, comment="Конец рабочего дня") rate_id = Column(Integer, ForeignKey("rate.id")) users = relationship("User", back_populates="clinic") rate = relationship("Rate", back_populates="clinics") class Rate(Base): '''Таблица с тарифами''' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), unique=True, nullable=False, comment="Наименование") price = Column(Integer, nullable=False, comment="Стомость") is_active = Column(Boolean, default=True, comment="Активный") clinics = relationship("Clinic", back_populates="rate") class User(Base): '''Модель пользователя''' id = Column(Integer, primary_key=True, index=True) first_name = Column(String, index=True) last_name = Column(String, index=True) patronymic = Column(String, index=True) birthday = Column(Date) image = Column(String, nullable=True) email = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=False) is_active = Column(Boolean(), default=True) is_superuser = Column(Boolean(), default=False) clinic_id = Column(Integer, ForeignKey('clinic.id')) clinic = relationship("Clinic", back_populates="users")
При попытке создать миграцию алембик ругается.
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'clinic.rate_id' could not find table 'rate' with which to generate a foreign key to target column 'id'
Дополнительно:
Вероятнее потому что сначала вы создаете таблицу клиники с ссылкой на таблицу которой еще нет
поменяете их местами
Помогло решение заменить
rate_id = Column(Integer, ForeignKey("rate.id"))
на
from app.models.rate import Rate #начала импортируем модель rate_id = Column(Integer, ForeignKey(Rate.id)) |
from app.models.rate import Rate #начала импортируем модель rate_id = Column(Integer, ForeignKey(Rate.id))
Я так и не понял, почему вариант с передачей строки не сработал.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема с созданием миграции в моделях SQLAlchemy с использованием Alembic может возникать по нескольким причинам. Вот несколько возможных причин и способы их решения:
1. Неправильная настройка Alembic: Убедитесь, что Alembic правильно skonfigurowany для работы с вашими моделями SQLAlchemy. Для этого убедитесь, что вы правильно skonfigurowany alembic.ini файл и указали правильный путь к вашим моделям в секции [alembic]. Также убедитесь, что вы правильно настроили путь к вашим моделям в alembic/env.py файле.
2. Отсутствие изменений в моделях: Alembic создает миграции на основе изменений в ваших моделях SQLAlchemy. Если ваши модели не были изменены с момента последнего запуска Alembic, то он не создаст новую миграцию. Убедитесь, что вы внесли какие-либо изменения в свои модели перед запуском Alembic.
3. Проблемы с зависимостями: Иногда проблема может быть связана с зависимостями между различными моделями в вашем проекте. Убедитесь, что все зависимости правильно skonfigurowany в ваших моделях и что Alembic может правильно их обработать при создании миграции.
Если вы все еще сталкиваетесь с проблемой, попробуйте выполнить следующие шаги:
1. Проверьте журналы и сообщения об ошибках: Просмотрите журналы и сообщения об ошибках, чтобы понять, что именно пошло не так при создании миграции.
2. Попробуйте пересоздать базу данных: Иногда проблема может быть связана с базой данных. Попробуйте пересоздать базу данных и запустить Alembic снова.
3. Обратитесь за помощью: Если все остальное не помогло, обратитесь за помощью к сообществу или специалистам по SQLAlchemy и Alembic. Возможно, они смогут помочь вам решить проблему более детально.
Надеюсь, что эти советы помогут вам решить проблему с созданием миграции в моделях SQLAlchemy с использованием Alembic. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их!