我正在使用一段时间的烧瓶设置,现在尝试在其上安装Flask-Blogging模块。目前的模块: - 带有postgres的Flask-sqlalchemy - Flask-login - Flask-Blogging(新)
我的application.py看起来像这样:
from flask import Flask
from flask import session
from flask.ext.blogging import SQLAStorage, BloggingEngine
from flask.ext.login import LoginManager
from flask.ext.sqlalchemy import SQLAlchemy
'''
The main application setup. The order of things is important
in this file.
'''
app = Flask(__name__)
app.config.from_object('config.base')
app.config.from_envvar('APP_CONFIG_FILE')
'''
Initialize database
'''
db = SQLAlchemy(app)
'''
Initialize blogger
'''
storage = SQLAStorage(db=db)
blog_engine = BloggingEngine(app, storage)
最后两行是我添加的唯一新内容(除了导入)。突然,现在我收到有关重复表名的错误:
sqlalchemy.exc.InvalidRequestError: Table 'customer' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
任何想法我做错了什么?除了以下内容之外,我找不到关于Flask-Blogging的更多文档: http://flask-blogging.readthedocs.org/en/latest/
答案 0 :(得分:2)
您收到此错误,因为在SQLAStorage.__init__
中有以下行:
self._metadata.reflect(bind=self._engine)
这将查看您的数据库并为所有当前数据库中的表创建sqlalchemy表格。
因此,如果您的数据库在代码中包含一个名为“customer”的表:
storage = SQLAStorage(db=db)
将自动为您设置名为“customer”的sqlalchemy表格。
现在......毫无疑问,你可以在某个地方拥有自己的数据库模型定义,可能在另一个python模块中,类似于:
class Customer(db.Model):
id = db.Column(db.Integer, primary_key=True)
...
由于此类定义定义了一个名为“customer”的表,并且SQLAStorage
已经定义了一个名为“customer”的表,因此只要导入类Customer
,就会得到异常。
解决此问题的一些方法是:
SQLAStorage
'''
Initialize database
'''
db = SQLAlchemy(app)
import ankit.db_models # import my db models here so SQLAStorage doesn't do it first
'''
Initialize blogger
'''
storage = SQLAStorage(db=db)
blog_engine = BloggingEngine(app, storage)
或
SQLAStorage
使用自己的元数据通过将db
参数传递给SQLAStorage.__init__
,您告诉它使用您的元数据。您只需传递engine
参数即可创建自己的元数据。
storage = SQLAStorage(engine=db.engine)