Ответ 1
Я сделал это вручную на моем db init script следующим образом:
from sqlalchemy.schema import CreateSchema
engine.execute(CreateSchema('my_schema'))
Но это кажется менее волшебным, чем я ожидал.
У меня есть модель 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 или мне нужно вызвать это вручную?
Я сделал это вручную на моем db init script следующим образом:
from sqlalchemy.schema import CreateSchema
engine.execute(CreateSchema('my_schema'))
Но это кажется менее волшебным, чем я ожидал.
Я столкнулся с той же проблемой и считаю, что "самый чистый" способ выпуска 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"))