Подтвердить что ты не робот

Получение SQLAlchemy для выпуска CREATE SCHEMA на create_all

У меня есть модель SqlAlchemy с аргументом схемы следующим образом:

Base = declarative_base()

class Road(Base):
  __tablename__ = "roads"
  __table_args__ = {'schema': 'my_schema'}
  id = Column(Integer, primary_key=True)

Когда я использую Base.metadata.create_all (engine), он корректно выдает CREATE TABLE с именем схемы спереди, так что "CREATE TABLE my_schema.roads(", но Postgresql справедливо жалуется, что схема не существует.

Мне не хватает шага, чтобы заставить SqlAlchemy выпустить CREATE SCHEMA my_schema или мне нужно вызвать это вручную?

4b9b3361

Ответ 1

Я сделал это вручную на моем db init script следующим образом:

from sqlalchemy.schema import CreateSchema
engine.execute(CreateSchema('my_schema'))

Но это кажется менее волшебным, чем я ожидал.

Ответ 2

Я столкнулся с той же проблемой и считаю, что "самый чистый" способ выпуска DDL-это примерно так:

from sqlalchemy import event
from sqlalchemy.schema import CreateSchema

event.listen(Base.metadata, 'before_create', CreateSchema('my_schema'))

Это гарантирует, что прежде чем что-либо, содержащееся в метаданных вашей базы, будет создано, у вас есть схема для нее. Это, однако, не проверяет, существует ли схема.

Вы можете сделать CreateSchema('my_schema').execute_if(callback_=check_schema), если вам может быть необходимо написать обратный вызов check_schema ( " Управление последовательностями DDL" на should_create в документах). Или, как простой выход, просто используйте DDL("CREATE SCHEMA IF NOT EXISTS my_schema") вместо (для Postgres):

from sqlalchemy import DDL

event.listen(Base.metadata, 'before_create', DDL("CREATE SCHEMA IF NOT EXISTS my_schema"))