AttributeError: module 'sqlalchemy' has no attribute '__all__'

回答 2 浏览 3248 2023-01-29

在我的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 Action、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的修复方法现在是否奏效。

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

Wolfgang Fahl 提问于2023-01-29
我已经完全取消了对flask的使用,因为过去这样的问题出现得太频繁了,而且我正在为我的大多数项目迁移到反应式的justpy.io,以获得更好的用户接口。Wolfgang Fahl 2023-01-31
2 个回答
#1楼 已采纳
得票数 11

在最近发布的SQLAlchemy 2.0中,.__all__属性似乎已经被移除。你可能需要在你的配置中以某种方式固定SQLAlchemy的版本。或者确保你使用的是Flask-SQLAlchemy 3.0.2或更高版本,因为这个问题表明该版本有必要的修复。

snakecharmerb 提问于2023-01-29
谢谢 - 我正在用github.com/WolfgangFahl/pyFlaskBootstrap4/commit/…来测试这个假设。Wolfgang Fahl 2023-01-29
与1.x系列相比,SQLA 2.0有很大的变化,正如你所期望的。因此,在你能彻底测试之前,钉住SQLA版本可能比升级Flask-SQLA更安全。但当然这取决于你。snakecharmerb 2023-01-29
我在提交中所作的修改对问题没有影响。在SQLAlchemy 2.5.1中似乎也没有问题。我不明白现在的问题是怎么出现的。似乎在我们过去使用的一些setup和requirments.txt文件中使用~并没有产生我们所认为的效果,现在依赖性处理开始以奇怪和意外的方式进行。Wolfgang Fahl 2023-01-29
那应该是Flask-SQLAlchemy-2.5.1 - Flask-SQLAlchemy和SQLAlchemy不共享版本。如果升级Flask-SQLAlchemy对你不起作用,我建议改用sqlalchemy<2.0snakecharmerb 2023-01-29
主要问题似乎是管道试图做神奇的事情。它让人更难找到正确的版本集,而不是更简单。Wolfgang Fahl 2023-01-29
#2楼
得票数 4

我通过在flask-SQLAlchemy之前添加特定版本的SQLAlchemy到我的需求中,解决了这个问题。例子。

Flask==2.1.3
SQLAlchemy==1.4 (new one)
flask-restx==0.5.1

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

Saul Burgos 提问于2023-01-31
固定是邪恶的,无济于事这正是我放弃的原因。Wolfgang Fahl 2023-02-01
通过固定相同的 dep 树在这里工作。谢谢@saul-burgos。 Python 需要锁文件文化。解决一次树,提交它。 Idk 如果固定是邪恶的但可重复构建是好的。 :)squarism 2023-02-06