python - sqlalchemy.exc.OperationalError : Can't connect to mysql in docker

标签 python mysql docker sqlalchemy docker-compose

我正在使用 sqlalchemy 和 mysql,该过程对于本地安装的 mysql 运行良好,但我无法将其与 mysql docker 镜像连接。我使用 pymysql 作为驱动程序。这是我运行的命令行,但收到​​如下所示的错误。

以下是/docker-compose.yml 和 python 文件的部分。我还有一个脚本,可以在 docker mysql 中创建一个名为“sqlalchemy”的数据库,下面未显示。

/docker-compose.yml

services:
  db:
    build: ./database
    restart: always
    ports:
      - "3309:3306"
    environment:
      - MYSQL_USER=root
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_HOST=db

/sqlalchemy.py

 msqldb_uri = 'mysql+pymysql://root:password@db:3309/sqlalchemy'
 engine = create_engine(msqldb_uri)



sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'db' ([Errno 111] Connection refused)")

最佳答案

如果脚本在容器内运行,则您不会在连接中使用发布端口,但应在本地主机或同一网络中使用 3306。发布端口用于外部世界。

 msqldb_uri = 'mysql+pymysql://root:password@localhost:3306/sqlalchemy'
 engine = create_engine(msqldb_uri)

如果脚本在同一 docker-compose 文件中的其他容器中运行,那么您也不需要发布端口。

 msqldb_uri = 'mysql+pymysql://root:password@db:3306/sqlalchemy'
 engine = create_engine(msqldb_uri)

如果在主机和数据库上运行的脚本在容器内运行,那么您需要连接发布端口,但不应使用容器名称作为 IP。

 msqldb_uri = 'mysql+pymysql://root:password@localhost:3309/sqlalchemy'
 engine = create_engine(msqldb_uri)

关于python - sqlalchemy.exc.OperationalError : Can't connect to mysql in docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57900531/

相关文章:

python - 如何将小时 "column"添加到仅包含分钟和秒的日期时间系列

ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例

python - 不解 "' tuple'对象不支持项赋值”错误

python - 如何与运行 Python 脚本进行交互

php - 如何检查我的 SQL 表中是否存在数据以及它是否不插入更新的数据?

mysql - 在mysql中存储mp3文件

php - 用户/密码身份验证 PHP/MySQL - PHP 或 MySQL 查询中的比较?

docker - 获取图像摘要的 docker registry v2 API 端点是什么?

docker - Vagrant 的docker提供程序构建缓慢

Python Multiprocessing 遍历脚本