Минимальный пример
Я сделал минимальный пример, чтобы объяснить, чего я хочу достичь.
Давайте воспользуемся следующая база данных

Это заполнено следующими данными
Код: Выделить всё
--------------
users
--------------
id firstname lastname email
0 1 user1_firstname user1_lastname user1@yopmail.com
1 2 user2_firstname user2_lastname user2@yopmail.com
--------------
characters
--------------
id name user_id
0 1 User1_Char1 1
1 2 User1_Char2 1
2 3 User2_Char1 2
--------------
items
--------------
id name character_id
0 1 Hat 1
1 2 Boots 1
2 3 Pantie 2
3 4 Nose Ring 3
4 5 Toothpick 3
Код: Выделить всё
from sqlalchemy import create_engine, Column, ForeignKey, Integer, String
from sqlalchemy.orm import declarative_base, relationship, sessionmaker
Base = declarative_base()
class Character(Base):
__tablename__ = 'characters'
id = Column(Integer, primary_key=True)
name = Column(String)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", back_populates='characters')
items = relationship("Item", back_populates="character")
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True)
name = Column(String)
character_id = Column(Integer, ForeignKey('characters.id'))
character = relationship("Character", back_populates='items')
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
firstname = Column(String)
lastname = Column(String)
email = Column(String)
characters = relationship("Character", back_populates="user")
Код: Выделить всё
# Create a session and query
engine = create_engine("mysql+pymysql://{user}:{pw}@{ip}/{db}"
.format(user="root",
pw="********",
ip="localhost",
db="test_game_public"))
Session = sessionmaker(bind=engine)
session = Session()
users = session.query(User).all()
for user in users:
print("----------------------------------------------------")
print(f"User : {user.id} - {user.email}")
for character in user.characters:
print(f"\tCharacter : {character.id} - {character.name}")
for item in character.items:
print(f"\t\tItem : {item.id} - {item.name}")
Код: Выделить всё
----------------------------------------------------
User : 1 - user1@yopmail.com
Character : 1 - User1_Char1
Item : 1 - Hat
Item : 2 - Boots
Character : 2 - User1_Char2
Item : 3 - Pantie
----------------------------------------------------
User : 2 - user2@yopmail.com
Character : 3 - User2_Char1
Item : 4 - Nose Ring
Item : 5 - Toothpick
Теперь представьте, что я хочу переместите таблицу пользователей в отдельную базу данных, чтобы разделить игровые данные и личные данные о клиентах.
Есть ли способ указать в классе модели, база данных, с которой он связан?
Например, что-то вроде
Код: Выделить всё
class UserBase):
__databasename__ = 'test_game_private'
__tablename__ = 'user'
Я не уверен, что то, что я хочу, возможно с помощью sqlalchemy, поскольку я не нашел ничего подобного. Однако я уже достиг такого с другими ORM (например, с Eloquent в PHP, который позволяет указывать соединение с базой данных внутри класса модели)
Подробнее здесь: https://stackoverflow.com/questions/790 ... el-classes