Python Flask SQLAlchemy单元测试失败无效请求错误:表';{table_name}';已为此元数据实例定义了

Python Flask SQLAlchemy单元测试失败无效请求错误:表';{table_name}';已为此元数据实例定义了,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我正在用Flask、SQLAlchemy和最近集成的Flask SQLAlchemy扩展构建一个API服务。虽然我可以独立运行应用程序并成功调用API,但我在尝试运行unittests时遇到了一个问题。我认为问题在于多次导入db.Model类型 例外情况如下: Error Traceback (most recent call last): File "/Users/james/.pyenv/versions/2.7.10/lib/python2.7/unittest/case.py", l

我正在用Flask、SQLAlchemy和最近集成的Flask SQLAlchemy扩展构建一个API服务。虽然我可以独立运行应用程序并成功调用API,但我在尝试运行unittests时遇到了一个问题。我认为问题在于多次导入db.Model类型

例外情况如下:

Error
Traceback (most recent call last):
  File "/Users/james/.pyenv/versions/2.7.10/lib/python2.7/unittest/case.py", line 322, in run
    self.setUp()
  File "/Users/james/Documents/workspace/trustmile-backend/trustmile/tests/test_users.py", line 28, in setUp
    from trustmile.app.users.model import User, ConsumerUser, CourierUser, AuthSession, Location, UserAddress, db
  File "/Users/james/Documents/workspace/trustmile-backend/trustmile/app/users/model.py", line 23, in <module>
    class User(db.Model, UniqueMixin, TableColumnsBase, References):
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 536, in __init__
    DeclarativeMeta.__init__(self, name, bases, d)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/ext/declarative/api.py", line 55, in __init__
    _as_declarative(cls, classname, cls.__dict__)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 88, in _as_declarative
    _MapperConfig.setup_mapping(cls, classname, dict_)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 103, in setup_mapping
    cfg_cls(cls_, classname, dict_)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 131, in __init__
    self._setup_table()
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 394, in _setup_table
    **table_kw)
  File "/Users/james/.virtualenvs/trustmile-api-p2710/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", line 398, in __new__
    "existing Table object." % key)
InvalidRequestError: Table 'tmuser' is already defined for this MetaData instance.  Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
在运行时使用:

from app import app
app.run(debug=True, host='0.0.0.0', port=5001)
效果很好

我的test_users.py的开头如下所示:

__author__ = 'james'

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

import config
from app.messaging import EmailHandler

app = Flask(__name__, static_folder='api/static', static_url_path='/static')
app.config.from_object(config)

db = SQLAlchemy(app)

EmailHandler.setup(config.EMAIL_API_KEY_DEV)
from app.api.consumer_v1 import bp as blueprint
app.register_blueprint(blueprint, url_prefix = '/consumer/v1')
app.test_request_context()
__author__ = 'james'
from trustmile.app.exc import InvalidEmailException
from trustmile.app.exc import InsecurePasswordException
from nose.tools import assert_true, raises
from trustmile.app.users.model import User, ConsumerUser, CourierUser, AuthSession, Location, UserAddress, db
from . import TransactionalTest



email_address = 'james@cloudadvantage.com.au'
test_password = 'mypassword'


class UserTest(TransactionalTest):



    @classmethod
    def setUpClass(cls):
        super(UserTest, cls).setUpClass()

    def setUp(self):
        super(UserTest, self).setUp()

    def test_create_user(self):
        user = User()
        db.session.add(user)
这一定是进行单元测试的一种相当常见的方式,是的,我在模块之间共享SQLAlchemy对象(我确信这是一种不好的做法)。我用nosetests运行它,在初始化代码时出错。很抱歉问了这么长的问题,希望有人能帮我

__table_args__ = {'extend_existing': True}

右下方的
\uuuu tablename\uuuu

也遇到了同样的问题。我猜这是一个炼金术问题这可能是一个导入
models.py
两次并使用不同名称的案例…@silverdagger,你找到解决方案了吗?