在create_all函数开始创建表之前创建PostgreSQL模式

时间:2015-09-07 19:55:49

标签: postgresql flask sqlalchemy flask-sqlalchemy

我开始使用Flask和PostgreSQL为我的后端开发一个应用程序,我正在使用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()

调用侦听器,但错误仍然存​​在。架构未在数据库中创建。

注意: 使用另一个模块中的Flask应用程序实例初始化数据库,如下所示:

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

感谢。

1 个答案:

答案 0 :(得分: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()

嗯,这是一个适合我特定情况的解决方案。