我开始使用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
感谢。
答案 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()
嗯,这是一个适合我特定情况的解决方案。