Vague Flask-SQLAlchemy错误:“AttributeError:mapper”

时间:2017-06-22 00:45:17

标签: python flask-sqlalchemy

好的,所以我有一个非常基本的模型定义。我没有第一个线索从哪里开始。我真正想要检查的唯一事情就是表存在,而且确实存在,并且db.create_all()函数似乎能够根据模型定义创建表。

错误似乎是如此模糊,以至于它并没有真正给我任何关于在哪里寻找的线索。错误基本上是什么意思? class StatisticsAdapter extends ArrayAdapter<String>{ public StatisticsAdapter(@NonNull Context context, String[] resource) { super (context, R.layout.listview_layout ,resource); } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { LayoutInflater ListInflate = LayoutInflater.from(getContext ()); StatsitcsHelper statsitcsHelper = new StatsitcsHelper (); View customView = ListInflate.inflate (R.layout.listview_layout,parent,false); String first = getItem (0); TextView date = (TextView) customView.findViewById (R.id.List_Date); String Second = getItem (1); TextView Weight = (TextView) customView.findViewById (R.id.List_Weight); String Thierd = getItem (2); TextView Percent = (TextView) customView.findViewById (R.id.List_Percentage); date.setText (first); Weight.setText (Second); Percent.setText (Thierd); return customView; } } 类无法映射?它没有名为Setting的属性?

以下是代码:

mapper

我也尝试检查shell中的代码......似乎正在运行。

# 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

1 个答案:

答案 0 :(得分: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()的引用已不再有效,因为模型被提到的人已被移到其他地方。

这就是我如何解决它。