【问题标题】:Unable to set cloud spanner dialect for Alembic无法为 Alembic 设置云扳手方言
【发布时间】:2022-11-07 17:08:11
【问题描述】:

我已经安装了以下软件包 -

SQLAlchemy==1.4.41
sqlalchemy-spanner==1.2.2
alembic==1.8.1

然后我创建了一个文件main.py,我在其中为云扳手创建了一个 SQLAlchemy 引擎。

from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(
    "spanner+spanner:///projects/spanner-project/instances/spanner-instance/databases/spanner-database"
)
metadata = MetaData()
Base = declarative_base(metadata=metadata)

然后在alembic.ini 中,我使用了与上面显示的引擎相同的网址。

sqlalchemy.url = spanner+spanner:///projects/spanner-project/instances/spanner-instance/databases/spanner-database

同样在env.py 中,我设置了基础的元数据,如下所示 -

from app.main import Base
target_metadata = Base.metadata

我还有一个models.py,它只有一个模型,如下所示 -

from app.main import Base
from sqlalchemy import (
    Column,
    Integer,
    String,
)


class Users(Base):
    __tablename__ = "users"
    __table_args__ = {
        'extend_existing': True,
    }
    id = Column(Integer, primary_key=True)
    name = Column(String(50))

当我运行 alembic 命令生成迁移时,我看到了 KeyError: 'spanner+spanner' 的异常。

指令 -

alembic revision --autogenerate -m "first migrations"

例外 -

Traceback (most recent call last):
  File "/usr/local/bin/alembic", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.10/site-packages/alembic/config.py", line 590, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/usr/local/lib/python3.10/site-packages/alembic/config.py", line 584, in main
    self.run_cmd(cfg, options)
  File "/usr/local/lib/python3.10/site-packages/alembic/config.py", line 561, in run_cmd
    fn(
  File "/usr/local/lib/python3.10/site-packages/alembic/command.py", line 229, in revision
    script_directory.run_env()
  File "/usr/local/lib/python3.10/site-packages/alembic/script/base.py", line 569, in run_env
    util.load_python_file(self.dir, "env.py")
  File "/usr/local/lib/python3.10/site-packages/alembic/util/pyfiles.py", line 94, in load_python_file
    module = load_module_py(module_id, path)
  File "/usr/local/lib/python3.10/site-packages/alembic/util/pyfiles.py", line 110, in load_module_py
    spec.loader.exec_module(module)  # type: ignore
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/code/app/alembic/env.py", line 79, in <module>
    run_migrations_online()
  File "/code/app/alembic/env.py", line 68, in run_migrations_online
    context.configure(
  File "<string>", line 8, in configure
  File "/usr/local/lib/python3.10/site-packages/alembic/runtime/environment.py", line 822, in configure
    self._migration_context = MigrationContext.configure(
  File "/usr/local/lib/python3.10/site-packages/alembic/runtime/migration.py", line 268, in configure
    return MigrationContext(dialect, connection, opts, environment_context)
  File "/usr/local/lib/python3.10/site-packages/alembic/runtime/migration.py", line 196, in __init__
    self.impl = ddl.DefaultImpl.get_by_dialect(dialect)(
  File "/usr/local/lib/python3.10/site-packages/alembic/ddl/impl.py", line 123, in get_by_dialect
    return _impls[dialect.name]

我试图通过将alembic.ini 中的URL 从spanner+sapnner:///..... 更改为spanner:///... 但后来我得到了这个异常 -

Traceback (most recent call last):
  File "/usr/local/bin/alembic", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.10/site-packages/alembic/config.py", line 590, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/usr/local/lib/python3.10/site-packages/alembic/config.py", line 584, in main
    self.run_cmd(cfg, options)
  File "/usr/local/lib/python3.10/site-packages/alembic/config.py", line 561, in run_cmd
    fn(
  File "/usr/local/lib/python3.10/site-packages/alembic/command.py", line 229, in revision
    script_directory.run_env()
  File "/usr/local/lib/python3.10/site-packages/alembic/script/base.py", line 569, in run_env
    util.load_python_file(self.dir, "env.py")
  File "/usr/local/lib/python3.10/site-packages/alembic/util/pyfiles.py", line 94, in load_python_file
    module = load_module_py(module_id, path)
  File "/usr/local/lib/python3.10/site-packages/alembic/util/pyfiles.py", line 110, in load_module_py
    spec.loader.exec_module(module)  # type: ignore
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/code/app/alembic/env.py", line 79, in <module>
    run_migrations_online()
  File "/code/app/alembic/env.py", line 61, in run_migrations_online
    connectable = engine_from_config(
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 743, in engine_from_config
    return create_engine(url, **options)
  File "<string>", line 2, in create_engine
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 309, in warned
    return fn(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 522, in create_engine
    entrypoint = u._get_entrypoint()
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/url.py", line 655, in _get_entrypoint
    cls = registry.load(name)
  File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 343, in load
    raise exc.NoSuchModuleError(
sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:spanner

此外,当我使用spanner+spanner:///... 创建和引擎,然后进一步使用它来创建数据库表时,我就能够成功地做到这一点。

from app.main import engine, Base
from sqlalchemy import (
    Column,
    Integer,
    String,
)


class Users(Base):
    __tablename__ = "users"
    __table_args__ = {
        'extend_existing': True,
    }
    id = Column(Integer, primary_key=True)
    name = Column(String(50))


Base.metadata.create_all(engine)

只需运行此模型,我就可以创建表。

python models.py

我该怎么做才能将alembic与扳手一起使用?

【问题讨论】:

  • 你检查过这个StackOverflow thread吗?你能验证你的env.py 文件吗?
  • 是的,Roopa 我经历过那篇文章,然后我创建了这个问题。
  • 您可以尝试使用pip3 install sqlalchemy-spanner 重新安装sqlalchemy-spanner 吗?也看看这个 StackOverflow thread1 & thread2
  • 我可以将扳手与 SQLAlchemy 一起使用。我上面发布的问题与 Alembic 和 SpannerDialect 有关

标签: python sqlalchemy alembic google-cloud-spanner


【解决方案1】:

您使用的是 SQLAlchemy 1.4,这意味着它必须无处不在 spanner+spanner。只是spanner 是行不通的。由于问题仅出现在 Alembic 上,因此重新安装也无济于事 - 问题出在某处的配置中。

你能显示你的env.py 文件吗?一定有这样的写法:

class SpannerImpl(DefaultImpl):
    __dialect__ = "spanner+spanner"

查看您的回溯,我怀疑在env.py 中,方言写为spanner,这会导致错误。

【讨论】:

    猜你喜欢
    • 2018-02-25
    • 2018-08-22
    • 2018-12-09
    • 2022-10-02
    • 2019-04-27
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多