我有一个名为两个表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)
问题出在哪里?
在您的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类表示的的构造。如果您已经通过其他方式(例如表反射)对表进行了引用,这将非常有用。在这里阅读更多。
| 归档时间: |
|
| 查看次数: |
1422 次 |
| 最近记录: |