2015-09-07 42 views
0

我開始爲我的後端開發使用Flask和PostgreSQL的應用程序,並且正在使用PostgreSQL模式。在create_all函數開始創建表之前創建PostgreSQL模式

我的問題是,當我調用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() 

所以,我沒有得到相關的應用程序上下文的任何問題。

編輯:

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() 

好了,這是我的具體情況有效的解決方案。