Укажите базу данных в классы модели декларативных таблиц sqlalchemyPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Укажите базу данных в классы модели декларативных таблиц sqlalchemy

Сообщение Anonymous »

В настоящее время я изучаю возможности sqlalchemy ORM и мне хотелось бы иметь возможность определять соединение с базой данных внутри классов декларативной табличной модели.

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

Это заполнено следующими данными

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

--------------
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
Я могу создать архитектуру ORM с помощью следующего кода

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

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'
А затем связать ядро ​​базы данных глобально таким образом, чтобы, если я свяжу оба ядра базы данных, ORM сможет извлекать данные из обеих баз данных, но если я свяжу только один механизм, будут извлечены только модели из связанной базы данных.
Я не уверен, что то, что я хочу, возможно с помощью sqlalchemy, поскольку я не нашел ничего подобного. Однако я уже достиг такого с другими ORM (например, с Eloquent в PHP, который позволяет указывать соединение с базой данных внутри класса модели)

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

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

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

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

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

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

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