Привет! Сегодня я бы хотел рассказать тебе о том, как я использовал библиотеку SQLAlchemy вместе с FastAPI, чтобы написать код для модели User, которая имеет связь через внешний ключ с моделью UserRole.
Перед тем как начать писать код, у меня уже была установлена и настроена FastAPI и SQLAlchemy. Надеюсь, у тебя уже все настроено, и ты готов писать код.Для начала, я создал класс UserRole, который будет представлять модель UserRole в базе данных. При создании таблицы UserRole в базе данных, мне также потребуется создать поле id, которое будет представлять уникальный идентификатор роли пользователя, и поле name, которое будет содержать название роли пользователя.python
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship
class UserRole(Base)⁚
__tablename__ ‘user_roles’
id Column(Integer, primary_keyTrue, indexTrue)
name Column(String, indexTrue)
users relationship(‘User’, back_populates’role’)
Затем я создал класс User, который будет представлять модель User в базе данных. У этого класса будет поле id для уникального идентификатора пользователя, а также поля name и email, содержащие имя и электронную почту пользователя соответственно. Кроме того, у него будет поле role_id, которое будет содержать внешний ключ на поле id в таблице UserRole.python
class User(Base)⁚
__tablename__ ‘users’
id Column(Integer, primary_keyTrue, indexTrue)
name Column(String, indexTrue)
email Column(String, uniqueTrue, indexTrue)
role_id Column(Integer, ForeignKey(‘user_roles.id’))
role relationship(‘UserRole’, back_populates’users’)
Наконец, я создал класс Database в файле database.py, который будет отвечать за соединение с базой данных и создание таблиц. В нем я добавил строки, которые будут создавать таблицы UserRole и User.python
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL ‘sqlite:///./test.db’
engine create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal sessionmaker(autocommitFalse, autoflushFalse, bindengine)
Base declarative_base
class Database⁚
def __init__(self)⁚
Base.metadata.create_all(bindengine)
def get_session(self)⁚
return SessionLocal
Теперь, когда все классы и таблицы созданы, я могу приступить к использованию этих моделей в FastAPI.python
from fastapi import FastAPI, Depends
from .database import Database, User, UserRole
app FastAPI
database Database
async def get_db⁚
db database.get_session
try⁚
yield db
finally⁚
db.close
@app.get(‘/users/{user_id}’)
def get_user(user_id⁚ int, db⁚ Session Depends(get_db))⁚
user db.query(User).filter(User.id user_id).first
return {‘name’⁚ user.name, ’email’⁚ user.email, ‘role’⁚ user.role.name}
В этом коде я создал функцию get_user, которая принимает user_id в качестве параметра и возвращает данные о пользователе с указанным идентификатором. Я использую внедрение зависимости, чтобы получить экземпляр соединения с базой данных в каждом запросе. Затем я выполняю запрос к базе данных, чтобы получить экземпляр User и возвращаю данные о пользователе, включая его имя, электронную почту и роль.
Данный пример демонстрирует, как использовать библиотеку SQLAlchemy вместе с FastAPI для создания модели User, которая имеет связь через внешний ключ с моделью UserRole. Я надеюсь, что тебе понравится использовать эти инструменты в своем проекте! Если у тебя возникнут какие-либо вопросы, не стесняйся задавать их!