首页 > 编程问答 >SQLAlchemy AttributeError:“表”对象在以前运行的模型中没有属性“id”

SQLAlchemy AttributeError:“表”对象在以前运行的模型中没有属性“id”

时间:2024-07-24 07:18:24浏览次数:8  
标签:python flask sqlalchemy flask-sqlalchemy attributeerror

我有一个烧瓶应用程序工厂应用程序,其中包含大量模型和视图。一切都工作正常,直到我将某些模块更改为 backref 以跟上时代的步伐。突然,应用程序无法工作,因为我在不同的模块中收到 sqlalchemy 属性错误,甚至在用户模块中,而这些模块根本没有被触及。 (见下文。) back_populates 关于 SO 的类似问题的大多数答案,例如:

this

SQLAlchemy: AttributeError: 'Table' object has no attribute 'id' and this

"'Table '对象没有属性'id'”在一个表上具有两个外键的 SQLAlchemy 关系上 重点关注导致问题的特定关系的定义。我不明白它如何适用于在更改为不同模型之前运行良好的模型。切实可行的建议将不胜感激。

focus on definitions of specific relationships causing the issue. I fail to see how it would apply incase of a model that worked fine before changes to a different model. Actionable advice will be greatly appreciated.

@login_manager.user_loader
def load_user(id):
    return User.query.get(id)

class User(db.Model):
    __tablename__ = 'users'
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    name = Column(String(100), unique=True, index=True, nullable=False)
    ...
File "C:\Users\user\folder\venv\Lib\site-packages\flask\app.py", line 1498, in __call__
return self.wsgi_app(environ, start_response)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask\app.py", line 1476, in wsgi_app
response = self.handle_exception(e)
           ^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask\app.py", line 1473, in wsgi_app
response = self.full_dispatch_request()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask\app.py", line 882, in full_dispatch_request
rv = self.handle_user_exception(e)
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask\app.py", line 880, in full_dispatch_request
rv = self.dispatch_request()
     ^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask\app.py", line 865, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c:\users\user\folder\app\templates\main\views.py", line 33, in home
return render_template('/layout/project/home.html', **context, **common_context)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask\templating.py", line 150, in render_template
return _render(app, template, context)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask\templating.py", line 127, in _render
app.update_template_context(context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask\app.py", line 493, in update_template_context
context.update(self.ensure_sync(func)())
               ^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask_login\utils.py", line 405, in _user_context_processor
return dict(current_user=_get_user())
                         ^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask_login\utils.py", line 370, in _get_user
current_app.login_manager._load_user()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask_login\login_manager.py", line 376, in _load_user
user = self._load_user_from_remember_cookie(cookie)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask_login\login_manager.py", line 420, in _load_user_from_remember_cookie
user = self._user_callback(user_id)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c:\users\user\folder\app\models\user.py", line 24, in load_user
return User.query.get(id)
       ^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\flask_sqlalchemy\model.py", line 30, in __get__
return cls.query_class(
       
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 273, in __init__
self._set_entities(entities)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 282, in _set_entities
self._raw_columns = [
                    
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\query.py", line 283, in <listcomp>
coercions.expect(
^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\sql\coercions.py", line 406, in expect
insp._post_inspect
^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 1254, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
                                       ^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2693, in _post_inspect
self._check_configure()
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2374, in _check_configure
_configure_registries({self.registry}, cascade=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 4186, in _configure_registries
_do_configure_registries(registries, cascade)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 4228, in _do_configure_registries
mapper._post_configure_properties()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2391, in _post_configure_properties
prop.init()
^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\interfaces.py", line 544, in init
self.do_init()
^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\relationships.py", line 1631, in do_init
self._process_dependent_arguments()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\relationships.py", line 1673, in _process_dependent_arguments
rel_arg._resolve_against_registry(self._clsregistry_resolvers[1])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\relationships.py", line 261, in _resolve_against_registry
self.resolved = clsregistry_resolver(
                
File "C:\Users\user\folder\venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 532, in __call__
x = eval(self.arg, globals(), self._dict)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<string>", line 1, in <module>
AttributeError: 'Table' object has no attribute 'id'

这个错误“AttributeError: 'Table' object has no attribute 'id'”通常意味着你在 SQLAlchemy 关系中引用了一个列,该列应该引用表本身,反之亦然。不幸的是,没有提供更改后的模型代码,因此我无法指出确切的原因。但是,我可以提供一个逐步的调试过程,并提供一些示例来帮助你识别和解决问题。

调试步骤

  1. 定位确切的失败关系:
  2. 错误消息提供了一个 traceback。仔细查看 traceback 以找到引发错误的确切行。这将指向涉及有问题的 relationship 定义的模型和文件。

  3. 检查关系定义:

  4. 确定导致错误的 relationship 定义后,请仔细检查以下内容:
    • backref back_populates 参数: 确保这些参数引用的列名在相关模型中作为实际列存在,并且它们是关系中的正确目标列。
    • primaryjoin 参数(如果使用): 验证连接条件是否正确,并使用相关模型中的实际列(而不是试图引用表本身的 id 属性)。

常见陷阱和解决方案

以下是使用 backref back_populates 时导致此错误的一些常见错误:

1. 在 backref back_populates 中引用表而不是列:

```python class Parent(db.Model): tablename = 'parents' id = Column(Integer, primary_key=True) children = relationship("Child", backref="Parent") # 错误:引用了表名,而不是列名

class Child(db.Model): tablename = 'children' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parents.id')) ```

解决方案: backref 中使用列名:

python children = relationship("Child", backref="parent") # 正确:引用 'parent_id' 列隐式创建的 'parent' 属性

2. 在关系两侧使用 backref back_populates

```python class Parent(db.Model): # ... children = relationship("Child", backref="parent")

class Child(db.Model): # ... parent = relationship("Parent", back_populates="children") # 错误:同时使用了 backref 和 back_populates ```

解决方案: 选择 backref back_populates ,而不是同时使用:

```python # 选项 1:仅使用 backref class Parent(db.Model): # ... children = relationship("Child", backref="parent")

class Child(db.Model): # ...

# 选项 2:仅使用 back_populates class Parent(db.Model): # ... children = relationship("Child", back_populates="parent")

class Child(db.Model): # ... parent = relationship("Parent") ```

3. 在连接条件中引用错误的列:

```python class Parent(db.Model): # ...

class Child(db.Model): # ... parent = relationship("Parent", primaryjoin="Parent.id == Child.parent_id") # 错误:在连接条件中引用了 'Parent' ```

解决方案: 使用表名或别名来引用列:

python parent = relationship("Parent", primaryjoin="Parent.id == Child.parent_id") # 正确:使用表名引用列

仔细检查你的关系定义,并根据这些常见错误进行更正。如果问题仍然存在,请提供你的模型代码,以便我提供更具体的帮助!

标签:python,flask,sqlalchemy,flask-sqlalchemy,attributeerror
From: 78785903

相关文章

  • Python使用Visual Studio打印功能不显示输出
    任务:检查一个整数是正数还是负数。检查整数是否能被2整除。当输入0时,我需要退出循环并报告每个计数和总和。print函数没有显示任何输出。这是我从defmain()开始使用的代码defmain():countpositive=0countnegative=0count_divisible_by_2=0sump......
  • Python 中的像素最小二乘法
    我有一个非线性前向模型,它计算每个像素参数w的灰度图像。我还可以使用scipys优化函数来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如7%的像素在40分钟内计算得很慢。我使用for循环遍历所有像素并按像素应用模型。我尝试过......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......
  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......
  • 如何在Python中计算小数?
    我正在创建一个计算器来用python计算企业的利润,但到目前为止我只能使用整数。这是我的代码示例:Gross=int(input("PleaseentertotalGrossRevenuefortheFiscalYear"))NetTaxes=int(Gross)*0.1所以我将会计年度的总收入乘以按“税率”计算,但我只能使用......
  • Flask API Pytest 单元测试由于 Pyodbc 失败
    我在使用Pytest时遇到一些问题。我的FlaskAPI使用pyodbc与MSSQL服务器数据库对话。该API在Docker容器中运行,我在Mac上运行它。我有一个健康检查(根级别即localhost:5000/)路由的单元测试,如下所示:fromappimportappdeftest_healthcheck(self):......
  • 如何使用 Python 打开 Google Firestore 上的特定数据库?
    我正在使用Firebase并使用以下代码从Firestore设置/检索文档:importfirebase_adminfromfirebase_adminimportcredentials,firestorecred=credentials.ApplicationDefault()firebase_admin.initialize_app(cred,options={"projectId":"huq-jimbo"})fires......