SQLAlchemy“AttributeError:'str'对象没有属性'c'”

Posted

技术标签:

【中文标题】SQLAlchemy“AttributeError:\'str\'对象没有属性\'c\'”【英文标题】:SQLAlchemy "AttributeError: 'str' object has no attribute 'c'"SQLAlchemy“AttributeError:'str'对象没有属性'c'” 【发布时间】:2019-04-27 06:38:48 【问题描述】:

我有两个名为 userspermissions 的表,我想使用名为 userPermissions 的表在它们之间创建关系。这是我的代码的样子:

类用户(基础): __tablename__ = '用户' id = Column(整数,primary_key=True) first_name = 列(文本) last_name = 列(文本,可为空=真) 类权限(基础): __tablename__ = '权限' id = Column(整数,primary_key=True) 标题 = 列(字符串(64)) allow_anonymous = 列(布尔值) 类用户权限(基础): __table__ = '用户权限' id = Column(整数,primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) permission_id = Column(Integer, ForeignKey('permissions.id')) 值 = 列(布尔值)

我知道我可能不正确地处理关系,但查看文档和搜索,我找不到它是什么。当我尝试使用db.Base.metadata.create_all(db.engine) 创建表时,出现以下错误:

/usr/bin/python3.6 /path/project/out.py
Traceback (most recent call last):
  File "/path/project/out.py", line 1, in <module>
    from components.database import setup
  File "/path/project/components/database/__init__.py", line 41, in <module>
    class UserPermission(Base):
  File "/home/user/.local/lib/python3.6/site-packages/sqlalchemy/ext/declarative/api.py", line 65, in __init__
    _as_declarative(cls, classname, cls.__dict__)
  File "/home/user/.local/lib/python3.6/site-packages/sqlalchemy/ext/declarative/base.py", line 116, in _as_declarative
    _MapperConfig.setup_mapping(cls, classname, dict_)
  File "/home/user/.local/lib/python3.6/site-packages/sqlalchemy/ext/declarative/base.py", line 144, in setup_mapping
    cfg_cls(cls_, classname, dict_)
  File "/home/user/.local/lib/python3.6/site-packages/sqlalchemy/ext/declarative/base.py", line 172, in __init__
    self._setup_table()
  File "/home/user/.local/lib/python3.6/site-packages/sqlalchemy/ext/declarative/base.py", line 481, in _setup_table
    if not table.c.contains_column(c):
AttributeError: 'str' object has no attribute 'c'

问题出在哪里?

【问题讨论】:

【参考方案1】:

在您的 UserPermission 课程中,您使用了错误的 dunder 属性:

__table__ = 'userPermissions'

应该是:

__tablename__ = 'userPermissions'

Sqlalchemy 正在尝试将字符串 'userPermissions' 视为 Table 对象。

关于__table____tablename__ 之间的区别,大多数情况只需要在声明性类上声明__tablename__ = "stringvalue"。它表示对象应该引用该名称的表,并且 SQLAlchemy 可以在内部处理该 Table 对象的构造。

在对象上声明 __table__ 会向 SQLAlchemy 发出信号,表明您希望控制 ORM 类所代表的 Table 的构造。如果您已经通过其他方式(如表反射)引用了该表,这将是最有用的。更多阅读here.

【讨论】:

【参考方案2】:
class UserPermission(Base):
    __table__ = 'userPermissions'

这里应该是:

class UserPermission(Base):
    __tablename__ = 'userPermissions'

【讨论】:

以上是关于SQLAlchemy“AttributeError:'str'对象没有属性'c'”的主要内容,如果未能解决你的问题,请参考以下文章

从 RDS 检索数据给出 AttributeError: 'sqlalchemy.cimmutabledict.immutabledict' 对象没有属性 'setdefault'

Python SQLAlchemy:AttributeError:'Column'对象和'Comparator'对象都没有属性'schema'

AttributeError:使用flask-sqlalchemy连接到sqlite数据库时无法设置属性

SQLAlchemy AutoMap AttributeError(尽管定义了主键)

如何使用Sqlalchemy中的automap_base处理AttributeError(key)? [重复]

flask wtforms sqlalchemy AttributeError:“str”对象没有属性“_sa_instance_state”