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

WiG*_*eky 3 python sqlalchemy

我有一个名为两个表users,并permissions和我想创建一个使用指定表它们之间的关系userPermissions。这是我的代码的样子:

类User(Base):
    __tablename__ ='用户'

    id =列(整数,primary_key = True)
    first_name =列(文本)
    last_name = Column(文本,nullable = True)

类Permission(Base):
    __tablename__ ='权限'

    id =列(整数,primary_key = True)
    标题=列(String(64))
    allow_anonymous =列(布尔)

类UserPermission(Base):
    __table__ ='userPermissions'

    id =列(整数,primary_key = True)
    user_id =列(整数,ForeignKey('users.id'))
    Permission_id = Column(整数,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'
Run Code Online (Sandbox Code Playgroud)

问题出在哪里?

Sup*_*oot 6

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

__table__ = 'userPermissions'
Run Code Online (Sandbox Code Playgroud)

应该:

__tablename__ = 'userPermissions'
Run Code Online (Sandbox Code Playgroud)

Sqlalchemy试图将字符串'userPermissions'视为Table对象。

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

__table__在对象上声明a会向SQLAlchemy发出信号,表示您希望控制TableORM类表示的的构造。如果您已经通过其他方式(例如表反射)对表进行了引用,这将非常有用。在这里阅读更多。