2015-09-07 45 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() 

好了,这是我的具体情况有效的解决方案。