如何将此代码纳入“工厂”范例?

时间:2017-09-25 19:47:09

标签: python flask flask-sqlalchemy

这是我在models.py文件中的代码,位于最底部,按照this guide

db.configure_mappers()
db.create_all()
db.commit()

这将在导入时执行。所以现在,每当我导入模型时,我都会收到以下消息:

RuntimeError: application not registered on db instance and no applicationbound to current context

我不确定如何将此代码纳入工厂范例。我试图将代码包装在一个函数中,然后在create_app中调用它。

当我这样做时,这就是我得到的错误:

sqlalchemy.exc.CompileError: (in table 'ad', column 'search_vector'): Compiler <sqlalchemy.dialects.sqlite.base.SQLiteTypeCompiler object at 0x7f81bfc14940> can't render element of type <class 'sqlalchemy.dialects.postgresql.base.TSVECTOR'>

search_vector列非常简单,取自sqlalchemy-searchable快速入门指南:

search_vector = db.Column(TSVectorType('title', 'body'))

1 个答案:

答案 0 :(得分:0)

您的方法是正确的 - 将函数初始化包装在函数中:

from models import db

def create_app():
    app = Flask(__name__)

    db.init_app(app)
    db.configure_mappers()
    db.create_all()
    db.commit()

    return app

app = create_app()

或者,如果您想避免使启动文件混乱,请定义将应用程序作为参数(models.py)的函数:

def init_db(app):
    db.init_app(app)
    db.configure_mappers()
    db.create_all()
    db.commit()

并使用该函数初始化应用程序:

from models import init_db

app = Flask(__name__)
init_db(app)

但是你的错误是由另一个问题引起的:SQLite不支持TSVector,它是PostgreSQL特有的功能。 SQAlchemy-Searchable的所有示例都是为PostgreSQL数据库编写的。

看起来SQLite没有开箱即用的全文搜索功能。也许您需要切换到另一个DBMS。