【问题标题】:Create PostgreSQL schemas before create_all function start creating the tables in Flask-SQLAlchemy在 create_all 函数开始在 Flask-SQLAlchemy 中创建表之前创建 PostgreSQL 模式
【发布时间】:2015-09-07 19:55:49
【问题描述】:

我开始使用 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

谢谢。

【问题讨论】:

    标签: postgresql flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我解决问题的快速方法是在调用 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()
    

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

    【讨论】:

      猜你喜欢
      • 2019-07-17
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2014-01-11
      • 2015-09-13
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多