繁体   English   中英

SQLAlchemy:AttributeError:“表”对象没有属性“ id”

[英]SQLAlchemy: AttributeError: 'Table' object has no attribute 'id'

我正在建立一个数据库,该数据库将我的本地产品目录与国外产品目录进行匹配。 当我只有唯一的表'Catalog' SQLAlchemy可以正常工作。 在添加了表CompetitorsCompetitors_catalog之后,我所有试图将记录添加到两个新表中的尝试均返回了错误。

AttributeError:“表”对象没有属性“ id”

我多次更改/删除/玩弄CompetitorsCompetitors_catalog之间的关系,通过来回摇动flask-migrate删除和创建表,但始终收到相同的错误。 Competitors.query.all()这样的简单查询将返回相同的结果。 删除了db.relationship() -相同的结果。 然后,我最终回滚到一个清晰的数据库,并从头开始进行flask-migrate来启动它。 之后,我开始尝试将记录添加到Catalog表时收到相同的错误,在回滚之前,该表工作正常。 这很奇怪,因为我没有对代码的那部分进行任何更改。

class Catalog(db.Model):
    __tablename__ = 'catalog'

    id            = db.Column(db.Integer, primary_key=True)
    name          = db.Column(db.String(60), index=True, nullable=False)
    parent_id     = db.Column(db.Integer, db.ForeignKey('catalog.id'), default=None)
    url           = db.Column(db.String())
    created       = db.Column(db.DateTime, default=datetime.now())
    last_modified = db.Column(db.DateTime, index=True, onupdate=datetime.now())

    categories = db.relationship('Catalog', remote_side='catalog.id', backref='parent')

class Competitors(db.Model):
    __tablename__ = 'competitors'

    id            = db.Column(db.Integer, primary_key=True)
    name          = db.Column(db.String(40), index=True, nullable=False)
    base_url      = db.Column(db.String())
    cat_url       = db.Column(db.String())
    created       = db.Column(db.DateTime, default=datetime.now())
    last_modified = db.Column(db.DateTime, onupdate=datetime.now(), default=datetime.now())

    sells = db.relationship('Competitors_catalog', backref='competitor', cascade="all, delete-orphan", passive_deletes=True, lazy='dynamic')

class CompCatalog(db.Model):
    __tablename__ = 'compcatalog'

    id            = db.Column(db.Integer, primary_key=True)
    out_id        = db.Column(db.Integer)
    name          = db.Column(db.String(60), index=True, nullable=False)
    top_section   = db.Column(db.Integer, default=None)
    comp_id       = db.Column(db.Integer, db.ForeignKey('competitors.id', ondelete="CASCADE"))
    url           = db.Column(db.String())
    created       = db.Column(db.DateTime, default=datetime.now())
    last_modified = db.Column(db.DateTime, index=True, onupdate=datetime.now())

简单创建新实例将返回错误。 但是在回滚之前工作正常。

from .models import Catalog

name = 'Apple'
rec = Catalog(name=name)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File ".../app/helpers.py", line 31, in create_catalog
    rec = Catalog(name=name)
  File "<string>", line 2, in __init__
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py", line 376, in _new_state_if_none
    state = self._state_constructor(instance, self)
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 855, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py", line 202, in _state_constructor
    self.dispatch.first_init(self, self.class_)
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/event/attr.py", line 322, in __call__
    fn(*args, **kw)
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 3360, in _event_on_first_init
    configure_mappers()
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 3248, in configure_mappers
    mapper._post_configure_properties()
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 1947, in _post_configure_properties
    prop.init()
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/orm/interfaces.py", line 196, in init
    self.do_init()
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1860, in do_init
    self._process_dependent_arguments()
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1889, in _process_dependent_arguments
    setattr(self, attr, attr_value())
  File ".../.virtualenvs/.../lib/python3.6/site-packages/sqlalchemy/ext/declarative/clsregistry.py", line 294, in __call__
    x = eval(self.arg, globals(), self._dict)
  File "<string>", line 1, in <module>
AttributeError: 'Table' object has no attribute 'id'

remote_side参数可以作为可评估的字符串传递,您已完成:

remote_side='catalog.id'

问题在于,在其中评估的名称空间包含Table对象和模型类,并且您引用的是Table而不是模型类。 只需将远端更改为

remote_side='Catalog.id'

或直接在类主体中传递id列:

class Catalog(db.Model):
    __tablename__ = 'catalog'

    id            = db.Column(db.Integer, primary_key=True)
    ...
    categories = db.relationship('Catalog', remote_side=id, backref='parent')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM