SQLAlchemy NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:spanner

SQLAlchemy NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:spanner

问题

我们正在尝试通过 SQLAlchemy 版本 1.3.23python-spanner-sqlalchemy 连接到 Cloud Spanner。使用 Poetry 进行依赖管理,sqlalchemy-spanner 已添加如下(项目是这样设置的):

sqlalchemy = "~1.3"
sqlalchemy-spanner = { git="https://github.com/cloudspannerecosystem/python-spanner-sqlalchemy.git", tag="v0.1.0" }

当用

调用 create_engine
create_engine("spanner:///projects/my-project/instances/my-instance/databases/my-db")

我收到以下错误

class 'sqlalchemy.exc.NoSuchModuleError'>", "NoSuchModuleError(\"Can't load plugin: sqlalchemy.dialects:spanner\")

尝试次数

注册表

我试过添加(如 conftest.py file in the python-spanner-sqlalchemy test 包中所示)

from sqlalchemy.dialects import registry

registry.register("spanner", "google.cloud.sqlalchemy_spanner", "SpannerDialect")

在调用 create_engine 之前,会导致以下错误:

class 'ModuleNotFoundError'>", "ModuleNotFoundError(\"No module named 'google.cloud.sqlalchemy_spanner'\")

这让我觉得插件方言没有正确添加,因为在 setup.py 的第 49 行中,建立了方言的连接:

entry_points={
    "sqlalchemy.dialects": [
        "spanner = google.cloud.sqlalchemy_spanner:SpannerDialect"
    ]
},

通过 python setup.py install

安装

在 spanner 项目的 README 中,它说要克隆 repo 并通过 python setup.py install 安装。我执行了这一步,但不确定如何将它导入我当前的项目或让我的项目知道这个库。我以前从未手动安装过 python 软件包,所以如果有人可以在这里提供任何帮助,我将不胜感激。

做过尝试的事情:

我不确定最后两个要点中的任何一个是否真的检查了包的本地安装。甚至不太确定我在说什么。

更新

我能够通过安装 sqlalchemy 但根本没有安装 sqlalchemy-spanner 来复制您看到的错误:

pip install sqlalchemy==1.3
pip uninstall sqlalchemy-spanner
>>> from sqlalchemy import create_engine
>>> engine = create_engine(<url>)
sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:spanner

安装后 sqlalchemy-spanner 我可以毫无问题地使用 SQLAlchemy:

pip install git+git://github.com/googleapis/python-spanner-sqlalchemy.git@v0.1.0
>>> from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, inspect
>>> engine = create_engine(<url>)
>>> metadata = MetaData(bind=engine)
>>> table = Table(
...     "TestTable",
...     metadata,
...     Column("user_id", Integer, primary_key=True),
...     Column("user_name", String(16), nullable=False),
... )
>>> table.create()
>>> inspect(engine).get_table_names()
['TestTable']
>>>

基于此,我认为问题是未安装 sqlalchemy-spanner。不幸的是,我不熟悉 Poetry 的依赖管理,所以我不确定到底出了什么问题。请注意,我们最近将存储库从 cloudspannerecosystem/python-spanner-sqlalchemy 移到了 googleapis/python-spanner-sqlalchemy。我可以将其中任何一个用于 pip 命令,但也许 Poetry 需要更新的命令?

抱歉回复晚了。我最近正在努力解决类似的问题。 Sqlalchemy 无法加载扳手方言。我尝试使用 pip 卸载和安装不同的版本,但似乎没有任何效果。

最后的诀窍是将数据库 URL 的“驱动程序”部分也指定为“spanner”。所以最后的 URL 看起来像这样:

spanner+spanner:///projects/project-id/instances/instance-id/databases/database-id

我不完全确定为什么这似乎是我的解决方案,因为我在 Google 末尾找到的所有文档都表明您只能使用“spanner:// /...“ 连接。此外,我不熟悉 sqlalchemy 的内部工作原理以及它应该如何检测其他已安装的方言。但是,我希望这个解决方案可以帮助其他人。