Я работаю с базой данных postgres, которая имеет несколько (похожих) схем. В моей кодовой базе я отражаю различные схемы в отдельных schema_xy.py
файлах. У меня также есть файл base.py
, который содержит базовый класс с определениями абстрактных таблиц для таблиц, представленных в нескольких схемах.
Мой base.py
файл:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('postgresql+psycopg2://dbuser@dbhost:5432/dbname')
Base = declarative_base(bind=engine)
class User(Base):
__abstract__ = True
id = ..
Ипример файла Schema1.py
, который наследует таблицу User
от базы, но также содержит таблицу, специфичную для схемы S1Table
:
from sqlalchemy import declarative_base
from .base import User
engine = create_engine('postgresql+psycopg2://dbuser@dbhost:5432/dbname')
Schema1Base = declarative_base(bind=engine, metadata=MetaData(schema='Schema1'))
class User(Schema1Base, User):
__tablename__ = "user"
class S1Table(Schema1Base):
__tablename__ = "s1table"
foo = ...
Мой вопрос заключается в том, как лучше всего создавать экземпляры сеансов для запроса и загрузки данных, которые «привязаны» к определенной схеме, т.е. как мне убедиться, что я запрашиваю / манипулирую таблицей User
из правильной схемы?
Я нашел этот пост в блоге
http://www.blog.pythonlibrary.org/2010/09/10/sqlalchemy-connecting-to-pre-existing-databases/
, который определяет loadSession
функцию для Base
следующим образом:
def loadSession():
metadata = Base.metadata
Session = sessionmaker(bind=engine)
session = Session()
return session
Но я не понимаю, что именно неиспользованный metadata
должен делать здесь точно.