Как я могу повторно использовать модель sqlalchemy ORM в нескольких базах данных и схемах? - PullRequest
1 голос
/ 28 октября 2010

У меня есть модель SQLAlchemy ORM, которая в настоящее время выглядит примерно так:

Base = declarative_base()

class Database(Base):

  __tablename__ = "databases"
  __table_args__ = (
    saschema.PrimaryKeyConstraint('db', 'role'),
    {
      'schema' : 'defines',
      },
    )


  db = Column(String, nullable=False)
  role = Column(String, nullable=False)
  server = Column(String)

Вот в чем дело, на практике эта модель существует в нескольких базах данных, и в этих базах данных она будет существовать в нескольких схемах.,Для любой одной операции я буду использовать только один (database, schema) кортеж.

Прямо сейчас я могу установить механизм базы данных, используя это:

Session = scoped_session(sessionmaker())
Session.configure(bind=my_db_engine)
# ... do my operations on the model here.

Но я не уверен, как яможно изменить __table_args__ во время выполнения, чтобы схема была правильной.

Ответы [ 2 ]

1 голос
/ 07 января 2014

Я также ищу элегантное решение этой проблемы. Если есть стандартные таблицы / модели, но разные имена таблиц, базы данных и схемы во время выполнения, как это обрабатывается? Другие предложили написать какую-то функцию, которая принимает имя таблицы и аргумент схемы, и строит модель для вас. Я обнаружил, что использование __abstract__ помогает. Я предложил решение здесь , которое может быть полезным. Он включает в себя добавление базы с определенной схемой / метаданными в наследство.

1 голос
/ 03 ноября 2010

Один из вариантов - использовать create_engine для привязки моделей к схеме / базе данных, а не для реальной базы данных.

#first connect to the database that holds the DB and schema
engine1 = create_engine('mysql://user:pass@db.com/schema1')

Session = session(sessionmaker())
session = Session(bind=engine1)

#fetch the first database
database = session.query(Database).first()

engine2 = create_engine('mysql://user:pass@%s/%s' % (database.DB, database.schema))
session2 = Session(bind=engine2)

Я не знаю, что это идеально, но это один из способов сделать это. Если вы предварительно кэшируете список баз данных, то в большинстве случаев вам нужно создать только один сеанс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...