Flask-Blogging错误表已定义

时间:2015-10-10 00:43:45

标签: python flask flask-sqlalchemy

我正在使用一段时间的烧瓶设置,现在尝试在其上安装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/

1 个答案:

答案 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)
相关问题