Почему alembic не создает миграцию в моделях sqlalchemy?

Ссылка скопирована
18 февраля 2026 1 ответ

Есть три модели с некоторыми связями между собой.
Модели

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))

Я так и не понял, почему вариант с передачей строки не сработал.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Стас DB Ответ

Проблема с созданием миграции в моделях 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. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их!

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно