Как избежать круглого импорта в SQLALCHEMY при использовании ORM для базы данных MYSQL? [закрыто]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как избежать круглого импорта в SQLALCHEMY при использовании ORM для базы данных MYSQL? [закрыто]

Сообщение Anonymous »

Как мне избежать создания круговых импортов, когда определения класса для каждой таблицы находятся в другом файле при использовании SQLalchemy для управления базой данных MySQL?
Я работаю с уже существующей базой, а файлы находятся в одной папке.

Код: Выделить всё

# in base.py

from sqlalchemy.orm import DeclarativeBase

class Base(DeclarativeBase):
pass

# in dish.py

from typing import List
from sqlalchemy import select, Column, Integer, ForeignKey, String, DECIMAL
from sqlalchemy.orm import Mapped, mapped_column, relationship
from base import Base

from recipe import Recipe

class Dish(Base):
__tablename__ = "dishes"
ID: Mapped[int] = mapped_column(Integer, primary_key=True)
dish_name: Mapped[str] = mapped_column(String(255))

composition: Mapped[List["Recipe"]] = relationship(
back_populates="dish",
foreign_keys="Recipe.ID_dish")

def some_method(self):
stmt = select(Ingredient).where(Ingredient.ID==1)
row = session.execute(stmt).first()
ing = row[0]
return ing.ID + self.ID

# in ingredient.py

from typing import List
from sqlalchemy import Column, Integer, ForeignKey, String, DECIMAL
from sqlalchemy.orm import Mapped, mapped_column, relationship
from base import Base

from recipe import Recipe

class Ingredient(Base):
__tablename__ = "food_ingredients"
ID: Mapped[int] = mapped_column(Integer, primary_key=True)
ingredient_name: Mapped[str] = mapped_column(String(255))

in_dishes: Mapped[List["Recipe"]] = relationship(
back_populates="ingredient",
foreign_keys="Recipe.ID_ingredient")

# in recipe.py (the linking table)

from sqlalchemy import Column, Integer, ForeignKey, DECIMAL
from sqlalchemy.orm import Mapped, mapped_column, relationship
from base import Base

from dish import Dish
from ingredient import Ingredient

class Recipe(Base):
__tablename__ = "recipe"
ID_dish: Mapped[int] = mapped_column(Integer, ForeignKey("dishes.ID"), primary_key=True)
ID_ingredient: Mapped[int] = mapped_column(Integer, ForeignKey("food_ingredients.ID"), primary_key=True)
amount: Mapped[float] = mapped_column(DECIMAL(5,2))

dish: Mapped["Dish"] = relationship(
back_populates="composition",
foreign_keys=[ID_dish])

ingredient: Mapped["Ingredient"] = relationship(
back_populates="in_dishes",
foreign_keys=[ID_ingredient])

# in main_1.py

from sqlalchemy import create_engine
from sqlalchemy.orm import Session, query
from dish import Dish
from ingredient import Ingredient
from recipe import Recipe

url = "the db url"
engine = create_engine(url, echo = True)

# the dish with ID=1 already exists in the database
with Session(engine) as session:
some_dish = session.query(Dish).get(1)
number = some_dish.some_method()
< /code>
Это трассировка исключения: < /p>
Traceback (most recent call last):
File "C:\Users\other\Desktop\main_1.py", line 11, in 
from dish import Dish
File "c:\program files\wing 101 10\bin\dbg\src\debug\tserver\dbgmonitoring.py", line 2205, in __import__
File "c:\program files\wing 101 10\bin\dbg\src\debug\tserver\dbgmonitoring.py", line 636, in ImportHook
File "c:\users\other\desktop\dish.py", line 6, in 
from recipe import Recipe
File "c:\program files\wing 101 10\bin\dbg\src\debug\tserver\dbgmonitoring.py", line 2205, in __import__
File "c:\program files\wing 101 10\bin\dbg\src\debug\tserver\dbgmonitoring.py", line 636, in ImportHook
File "c:\users\other\desktop\recipe.py", line 5, in 
from dish import Dish
builtins.ImportError: cannot import name 'Dish' from partially initialized module 'dish' (most likely due to a circular import) (C:\Users\other\Desktop\dish.py)
Я старался не импортировать ингредиент , рецепт и блюдо в модулях, однако я получаю там имени. Есть ли способ использовать ORM в отдельных файлах, не делая круговых импортов?

Подробнее здесь: https://stackoverflow.com/questions/797 ... sql-databa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»