python – Flask-Blogging错误表已定义

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

最佳答案 您收到此错误,因为在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__,您告诉它使用您的元数据.您只需传递引擎参数,它就会创建自己的元数据.

storage = SQLAStorage(engine=db.engine)
点赞