AttributeError: 模块 'sqlalchemy' 没有属性 '__all__'。

22

自从今天起,在我的 GitHub CI 中,我遇到了像下面这样的错误:

File "/home/runner/.local/lib/python3.8/site-packages/fb4/login_bp.py", line 12, in <module>
    from fb4.sqldb import db
  File "/home/runner/.local/lib/python3.8/site-packages/fb4/sqldb.py", line 8, in <module>
    db = SQLAlchemy()
  File "/home/runner/.local/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", line 758, in __init__
    _include_sqlalchemy(self, query_class)
  File "/home/runner/.local/lib/python3.8/site-packages/flask_sqlalchemy/__init__.py", line 112, in _include_sqlalchemy
    for key in module.__all__:
AttributeError: module 'sqlalchemy' has no attribute '__all__'

CRITICAL: Exiting due to uncaught exception <class 'ImportError'>

没有意识到任何可能导致此问题的重要提交。

我的本地测试和Jenkins CI仍然有效。

我将矩阵更改为坚持使用Python 3.8,而不是尝试3.9、3.10和3.11,同时考虑到python 3.9 AttributeError:module'posix'has no attribute'__all__'中类似问题是由于缺少对3.9的支持。

如何调试和减轻上述错误?

我假设问题在设置/环境或一些奇怪的GitHub actions、Python、pip或测试环境等方面。

我是参与的项目的提交者,包括:

更新: 在遵循@snakecharmerb的建议后,日志现在显示版本冲突。

RROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-with-dependency-conflicts
The conflict is caused by:
    The user requested Flask~=2.0.2
    bootstrap-flask 1.8.0 depends on Flask
    flask-dropzone 1.6.0 depends on Flask
    flask-login 0.6.2 depends on Flask>=1.0.4
    flask-httpauth 1.0.0 depends on Flask
    flask-sqlalchemy 3.0.2 depends on Flask>=2.2

这很有趣,因为我正在尝试避免使用 ~ 符号...实际上这是一个打字错误...让我们看看升级 Flask-SQLAlchemy>=3.0.2 的修复是否有效。

我按照建议设置版本后接受了答案。虽然还有后续问题,但问题已得到解答。


我已经完全放弃了使用Flask,因为过去经常出现这样的问题,而且我正在将大多数项目迁移到响应式https://justpy.io/,以获得更好的用户界面。 - Wolfgang Fahl
3个回答

24

看起来最近发布的SQLAlchemy 2.0中删除了.__all__属性。 您可能需要以某种方式固定配置中的SQLAlchemy版本,或确保使用Flask-SQLAlchemy 3.0.2或更高版本,因为此问题表明该版本具有所需的修复程序。


谢谢 - 我正在使用 https://github.com/WolfgangFahl/pyFlaskBootstrap4/commit/00ce9785418f9bfb83009a649dad15a77e27b80e 进行假设测试。 - Wolfgang Fahl
1
SQLAlchemy 2.0与1.x系列相比有着重大的变化,这是意料之中的。因此,在你能够彻底测试之前,固定SQLAlchemy的版本可能比升级Flask-SQLAlchemy更安全。当然,最终决定权在于你。 - snakecharmerb
1
我在提交中所做的更改对问题没有影响。SQLAlchemy 2.5.1似乎没有问题。我不明白为什么现在出现了问题。看起来我们过去在一些设置和requirements.txt文件中使用的~没有我们所假设的效果,现在依赖处理开始表现出奇怪和意外的方式。 - Wolfgang Fahl
3
那将是Flask-SQLAlchemy-2.5.1 - Flask-SQLAlchemy和SQLAlchemy不共享版本。如果升级Flask-SQLAlchemy无效,我建议改用sqlalchemy<2.0 - snakecharmerb
主要问题似乎是pip试图做一些神奇的事情。这使得找到正确版本集变得更加困难,而不是更简单。 - Wolfgang Fahl
我使用的是 Flask-SQLAlchemy==2.5.1,惊讶的是这个临时依赖没有被锁定或包含在内。我猜这又是过于简单的 requirements.txt 的另一个问题。我们需要像人类一样解决依赖树的问题。 - squarism

10
我通过在flask-SQLAlchemy之前将特定版本的SQLAlchemy添加到我的要求中来解决了这个问题。 例如:
Flask==2.1.3
SQLAlchemy==1.4 (new one)
flask-restx==0.5.1

我注意到pip正在安装2.0版本


固定代码是有害的,毫无帮助,这正是我放弃的原因。 - Wolfgang Fahl
1
在这里通过固定版本号工作,使用相同的依赖树。感谢 @saul-burgos。Python 需要锁定文件文化。解决一次依赖树,提交它。我不知道固定版本号是否有害,但可复现的构建是好的。 :) - squarism

2
对我来说,当我将flask-sqlalchemy升级到3.0.3版本时,它起作用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接