Невозможно подключить мою базу данных SQL к FastAPI и SQL SqlAlchemy

Я только начал изучать 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-сервер, если понадобится

Кажется, когда я запускаю приложение, таблица не создана.

большое спасибо за помощь

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы не импортировали Model.py к моменту запуска Base.metadata.create_all, он о них не знает. Попробуйте добавить import Model в свой main.py файл.

Могу ли я задать несколько глупых вопросов, например, что-то не так со структурой кода, что приводит к импорту неиспользуемого модуля в main.py? Или это часто случается с импортом Python, спасибо

Quốc Việt 08.06.2024 18:57

Две вещи: 1. Сейчас вы вообще не используете модели базы данных. В более полном примере вы, вероятно, использовали бы хотя бы некоторые из них в конечных точках вашего API либо непосредственно в main.py, либо в других файлах, которые, в свою очередь, импортируются в main.py. В реальной жизни бывают случаи, когда вам необходимо импортировать неиспользуемые модули, но это должно быть крайней мерой.

M.O. 08.06.2024 19:12

2. В более крупном проекте вам вообще не нужно вызывать Base.metadata.create_all в своем коде. В первый раз все будет работать нормально, но не позже, когда вам понадобится добавить новый столбец, особенно если у вас есть гигабайты данных. В этом случае вы должны использовать инструмент миграции, такой как перегонный куб, чтобы отслеживать изменения в структуре вашей базы данных. Затем вы запускаете миграцию базы данных как отдельный шаг перед запуском приложения.

M.O. 08.06.2024 19:20

Другие вопросы по теме