gpt4 book ai didi

postgresql - 在 create_all 函数开始在 Flask-SQLAlchemy 中创建表之前创建 PostgreSQL 模式

转载 作者:行者123 更新时间:2023-11-29 13:55:41 25 4
gpt4 key购买 nike

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

谢谢。

最佳答案

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

好吧,这是适合我的具体情况的解决方案。

关于postgresql - 在 create_all 函数开始在 Flask-SQLAlchemy 中创建表之前创建 PostgreSQL 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com