这是我在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'))
答案 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。