Я только начал изучать Python и FastAPI, чтобы участвовать в новом проекте, но не могу создавать таблицы или гарантировать, что приложение подключено к MySQL. Является ли причиной проблемы мой код или MySQL?
Файл database.py, в котором я объявляю конфигурацию базы данных.
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
DATABASE_URL = "mysql+pymysql://root:rorthai2002@localhost:3306/book_store"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
Файл Model.py, в котором я объявляю свою модель.
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, Mapped, mapped_column
from database import Base
class Author(Base):
__tablebane__ = "authors"
id = Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
name = Mapped[str] = mapped_column(String, nullable=False)
books = relationship("Book", back_populates = "author")
class Book(Base):
__tablebane__ = "books"
id = Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
title = Mapped[str] = mapped_column(String, nullable=False)
release_year = Mapped[int] = mapped_column(Integer, nullable=True)
author_id = Mapped[int] = mapped_column(Integer, ForeignKey("author.id"))
Файл main.py
from fastapi import FastAPI
from database import Base, engine
from schema import BookCreate
def create_tables():
Base.metadata.create_all(engine)
def start_application():
app = FastAPI()
create_tables()
return app
app = start_application()
@app.post("/books")
def create_books(book: BookCreate):
return book
@app.get("/books")
def get_books():
pass
Мой SQL-сервер, если понадобится
Кажется, когда я запускаю приложение, таблица не создана.
большое спасибо за помощь






Поскольку вы не импортировали Model.py к моменту запуска Base.metadata.create_all, он о них не знает. Попробуйте добавить import Model в свой main.py файл.
Две вещи: 1. Сейчас вы вообще не используете модели базы данных. В более полном примере вы, вероятно, использовали бы хотя бы некоторые из них в конечных точках вашего API либо непосредственно в main.py, либо в других файлах, которые, в свою очередь, импортируются в main.py. В реальной жизни бывают случаи, когда вам необходимо импортировать неиспользуемые модули, но это должно быть крайней мерой.
2. В более крупном проекте вам вообще не нужно вызывать Base.metadata.create_all в своем коде. В первый раз все будет работать нормально, но не позже, когда вам понадобится добавить новый столбец, особенно если у вас есть гигабайты данных. В этом случае вы должны использовать инструмент миграции, такой как перегонный куб, чтобы отслеживать изменения в структуре вашей базы данных. Затем вы запускаете миграцию базы данных как отдельный шаг перед запуском приложения.
Могу ли я задать несколько глупых вопросов, например, что-то не так со структурой кода, что приводит к импорту неиспользуемого модуля в main.py? Или это часто случается с импортом Python, спасибо