【问题标题】:Vague Flask-SQLAlchemy error: "AttributeError: mapper"模糊的 Flask-SQLAlchemy 错误:“AttributeError:mapper”
【发布时间】:2017-06-22 00:45:17
【问题描述】:

好的,所以我有一个看起来很基本的模型定义。我不知道从哪里开始。我唯一真正想到要检查的是该表是否存在,并且确实存在,并且 db.create_all() 函数似乎能够根据模型定义创建表。

这个错误似乎很模糊,以至于它并没有真正给我任何关于在哪里查看的线索。错误基本上是什么意思? Setting 类没有被映射?它没有名为mapper的属性?

代码如下:

# the model
class Setting(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)
    description = db.Column(db.String)
    value_type = db.Column(db.String)
    value = db.Column(db.String, nullable=False)

    def get(name):
        setting = db.session.query(Setting).filter(
            Setting.name == name).first()

        if setting.value_type == 'int':
            return int(setting.value)

        if setting.value_type == 'float':
            return float(setting.value)

    def all_settings():
        return {s.name: s.value for s in db.session.query(Setting).all()}

# what's causing the exception:
def load_default_settings():
    print("Loading default settings")

    # in case it helps:
    print(Setting.__dict__)
    # {'__mapper__': <Mapper at 0x7f5633523278; Setting>, 'name': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f563356eca8>, '__table__': Table('setting', MetaData(bind=None), Column('id', Integer(), table=<setting>, primary_key=True, nullable=False), Column('name', String(), table=<setting>, nullable=False), Column('description', String(), table=<setting>), Column('value_type', String(), table=<setting>), Column('value', String(), table=<setting>, nullable=False), schema=None), '__doc__': None, '_cached_tablename': 'setting', 'description': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f563356ed58>, 'get': <function Setting.get at 0x7f5633581f28>, '__init__': <function __init__ at 0x7f5636806400>, 'id': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f563356ebf8>, 'value': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f563356eeb8>, 'value_type': <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f563356ee08>, 'all_settings': <function Setting.all_settings at 0x7f563350c048>, '__module__': 'gg.settings', '_sa_class_manager': <ClassManager of <class 'gg.settings.Setting'> at 7f563350dd68>} 

    for name, details in SETTINGS.items():
        # calling the Setting constructor below causes the exception
        setting = Setting(
            name=name,
            description=details['description'],
            value=details['value'],
            value_type=details['value_type'])
        db.session.add(setting)

    db.session.commit()

# traceback
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    import gg.cli
  File "/home/nicken/freelance/project/gg/cli/__init__.py", line 75, in <module>
    reset_all()
  File "/home/nicken/freelance/project/gg/cli/__init__.py", line 55, in reset_all
    load_initial_data()
  File "/home/nicken/freelance/project/gg/cli/__init__.py", line 45, in load_initial_data
    load_default_settings()
  File "/home/nicken/freelance/project/gg/settings.py", line 84, in load_default_settings
    value_type=details['value_type']))
  File "<string>", line 2, in __init__
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/instrumentation.py", line 347, in _new_state_if_none
    state = self._state_constructor(instance, self)
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/util/langhelpers.py", line 764, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/instrumentation.py", line 177, in _state_constructor
    self.dispatch.first_init(self, self.class_)
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/event/attr.py", line 256, in __call__
    fn(*args, **kw)
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/mapper.py", line 2976, in _event_on_first_init
    configure_mappers()
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/mapper.py", line 2872, in configure_mappers
    mapper._post_configure_properties()
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/mapper.py", line 1765, in _post_configure_properties
    prop.init()
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/interfaces.py", line 184, in init
    self.do_init()
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/relationships.py", line 1652, in do_init
    self._process_dependent_arguments()
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/relationships.py", line 1709, in _process_dependent_arguments
    self.target = self.mapper.mapped_table
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/util/langhelpers.py", line 850, in __getattr__
    return self._fallback_getattr(key)
  File "/home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/util/langhelpers.py", line 828, in _fallback_getattr
    raise AttributeError(key)
AttributeError: mapper

我还尝试检查 shell 中的代码...似乎可以正常工作。

>>> from gg.app import db
>>> from gg.settings import Setting
>>> setting = Setting(name='test', description='test...', value='20', value_type='int')
>>> db.session.add(setting)
>>> db.session.commit()
>>> db.session.query(Setting).all()
[<gg.settings.Setting object at 0x7f5596d11fd0>]

【问题讨论】:

标签: python flask-sqlalchemy


【解决方案1】:

好的,所以我找到了解决方案。

我查看了堆栈跟踪,打开 /home/nicken/freelance/project/lib/python3.4/site-packages/sqlalchemy/orm/relationships.py 并转到第 1709 行。

然后我在第 1709 行上方添加了一个 print(self) 语句,这让我可以了解更多关于问题所在的信息。

事实证明...在我的代码的其他地方,在其他一些模型定义中,我有类似 db.relationship('foo.bar.etc.SomeModel') 的东西,并且传递给 db.relationship() 的引用不再有效,因为被引用的模型有被转移到别的地方了。

这就是我修复它的方法。

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2015-02-20
    • 2018-06-12
    • 1970-01-01
    相关资源
    最近更新 更多