fmw666 / fastapi-builder

🚀 这是一个用于快速构建 fastapi 项目基础框架的工具,您可以直接在上面着手开发您的 fastapi 项目.
MIT License
34 stars 8 forks source link

[bug] dbmanager.py执行run_migrate失败 #4

Closed Jackstrawcd closed 1 week ago

Jackstrawcd commented 2 weeks ago

描述

执行数据迁移脚本使用下面的命令:

python  dbmanager.py

显示执行迁移文件完成然而数据库中并不存在。

输出

过程中控制台会打印:

Traceback (most recent call last):
  File "/Users/wangdongming/miniconda3/envs/fastapi/bin/alembic", line 10, in <module>
    sys.exit(main())
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/alembic/config.py", line 588, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/alembic/config.py", line 582, in main
    self.run_cmd(cfg, options)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/alembic/config.py", line 559, in run_cmd
    fn(
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/alembic/command.py", line 320, in upgrade
    script.run_env()
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/alembic/script/base.py", line 563, in run_env
    util.load_python_file(self.dir, "env.py")
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/alembic/util/pyfiles.py", line 92, in load_python_file
    module = load_module_py(module_id, path)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/alembic/util/pyfiles.py", line 108, 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 "/Users/wangdongming/PyProj/avg/avg_msg_server/alembic/env.py", line 86, in <module>
    run_migrations_online()
  File "/Users/wangdongming/PyProj/avg/avg_msg_server/alembic/env.py", line 74, in run_migrations_online
    with connectable.connect() as connection:
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3194, in connect
    return self._connection_cls(self, close_with_result=close_with_result)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 96, in __init__
    else engine.raw_connection()
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3273, in raw_connection
    return self._wrap_pool_connect(self.pool.connect, _connection)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3243, in _wrap_pool_connect
    Connection._handle_dbapi_exception_noconnection(
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2097, in _handle_dbapi_exception_noconnection
    util.raise_(
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
    raise exception
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3240, in _wrap_pool_connect
    return fn()
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 310, in connect
    return _ConnectionFairy._checkout(self)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 868, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 476, in checkout
    rec = pool._do_get()
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 256, in _do_get
    return self._create_connection()
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 256, in _create_connection
    return _ConnectionRecord(self)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 371, in __init__
    self.__connect()
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 665, in __connect
    with util.safe_reraise():
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    compat.raise_(
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
    raise exception
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
    self.dbapi_connection = connection = pool._invoke_creator(self)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 590, in connect
    return dialect.connect(*cargs, **cparams)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 584, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/pymysql/connections.py", line 353, in __init__
    self.connect()
  File "/Users/wangdongming/miniconda3/envs/fastapi/lib/python3.10/site-packages/pymysql/connections.py", line 664, in connect
    raise exc
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 61] Connection refused)")
(Background on this error at: https://sqlalche.me/e/14/e3q8)

环境

python=3.10

额外信息

from logging.config import fileConfig

from sqlalchemy import engine_from_config from sqlalchemy import pool

from alembic import context from core.config import DATABASE_URL from db.base import Base

把当前项目路径加入到path中

sys.path.append(os.path.dirname(os.path.dirname(file)))

this is the Alembic Config object, which provides

access to the values within the .ini file in use.

config = context.config

Interpret the config file for Python logging.

This line sets up loggers basically.

fileConfig(config.config_file_name)

add your model's MetaData object here

for 'autogenerate' support

from myapp import mymodel

target_metadata = mymodel.Base.metadata

target_metadata = Base.metadata

other values from the config, defined by the needs of env.py,

can be acquired:

my_important_option = config.get_main_option("my_important_option")

... etc.

修改数据库地址

config.set_main_option('sqlalchemy.url', str(DATABASE_URL))

.......

fmw666 commented 2 weeks ago

报错信息为 (2003, "Can't connect to MySQL server on 'localhost' ([Errno 61] Connection refused)") (Background on this error at: https://sqlalche.me/e/14/e3q8),说明 alembic 在执行迁移文件时访问的是 localhost

修改 alembic.ini 将 sqlalchemy.url 中数据库信息改为和 .env 文件中 DB_CONNECTION 内容一致即可