2015-09-07 3 views
0

Я начинаю разрабатывать приложение с Flask и PostgreSQL для моего внутреннего интерфейса, и я использую схемы PostgreSQL.Создать схему PostgreSQL до того, как функция create_all начнет создавать таблицы

Моя проблема в том, что, когда я вызываю функцию database.create_all(), SQLalchemy выдал мне ошибку, потому что схема не существует.

Я пытаюсь создать необходимые схемы перед началом процесса создания, используя SQLAlchemy события и CreateSchema, но я не очень хорошо понимаю, как использовать CreateSchema, со следующим кодом:

from flask.ext.sqlalchemy import SQLAlchemy 
from sqlalchemy.event import listens_for 
from sqlalchemy.schema import CreateSchema 


database = SQLAlchemy() 

@listens_for(database.metadata, 'before_create') 
def create_schemas(target, b, **kw): 
    CreateSchema('app') 
    database.session.commit() 

Слушатель , но ошибка все еще сохраняется. Схема не создается в базе данных.

Примечание: база данных инициализируется экземпляром приложения Колба в другом модуле следующим образом:

from .model import database 
database.init_app(app) 

with app.app_context(): 
    database.create_all() 

Таким образом, я не получаю любые проблемы, связанные с контекстом приложения.

EDIT:

CreateSchema представляют CREATE SCHEMA SQL заявление с, который должен быть выполнен с database.session.execute(CreateSchema('app')).

Теперь я понимаю, что слушатель называется каждый раз, когда создается одна таблица, выбрасывая ошибку:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) schema "app" already exists 

Спасибо.

ответ

0

Быстрый способ, которым я решил свою проблему, заключался в создании схем непосредственно перед тем, как я позвоню database.create_all(). Я использовал инструкцию CREATE SCHEMA IF NOT EXISTS schema_name, которая создает схему, если она не существует. Это утверждение просто доступно, начиная с PostgreSQL 9.3

# my model module 
def create_schemas(): 
    """ Note that this function run a SQL Statement available just in 
     PostgreSQL 9.3+ 
    """ 

    database.session.execute('CREATE SCHEMA IF NOT EXISTS schema_name') 
    database.session.execute('CREATE SCHEMA IF NOT EXISTS schema_name2')  
    database.session.commit() 

Я инициализация базы данных и вызовом функции из другого модуля:

from .model import database, create_schemas 

database.init_app(app) 

    with app.app_context(): 
     create_schemas() 
     database.create_all() 

Ну, это решение, которое работает для моей конкретной ситуации.

Смежные вопросы