连接mysql使用sqlalchemy & Docker合成

6gpjuf90  于 2022-11-28  发布在  Mysql
关注(0)|答案(1)|浏览(160)

我试着让mysql与docker连接下面是我的docker compose文件:

version: "3.9"
services:
  db:

#    build: ./mysql
    image: mysql:8
    hostname: localhost
    environment:
      MYSQL_DATABASE: finops
      MYSQL_USER: root
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_PASSWORD: Roh1t#mishra
      # MYSQL_ROOT_PASSWORD: 'Roh1t#mishra'
      # MYSQL_TCP_PORT: '3306'

    ports:
      - 3307:3307
    expose:
      - 3307
  api:
    build: ./cost-controller-engine
    ports:
      - 8023:8023
    environment:
      WAIT_HOSTS: db:3307
    depends_on:
      - db
    links:
      - db
    expose:
      - 8023

  # Names our volume

下面是我使用sqlalchemy创建引擎代码:

engine = create_engine("mysql+mysqlconnector://root:Roh1t#mishra@127.0.0.1:3306/finops", echo=True)

但得到的错误

_mysql_connector.MySQLInterfaceError: Can't connect to MySQL server on '127.0.0.1:3306' (111)

帮助我使用sqlalchemy & docker连接MySQL。

ymdaylpp

ymdaylpp1#

缺省数据库端口为3306,通过注解env行,它仍保持为3306(取消注解它并设置不同的值将更改端口)。
如果不需要从外部(容器外部)连接到数据库,则不需要expose/ports,该端口当前设置为端口3307,因此未使用。

  • 注意:ports设置也用作曝光 *

如果我们使用docker compose,因此它很容易连接多个容器,我们使用容器名称进行网络调用,在这种情况下如果从容器api我要连接到容器db中的数据库,我使用db:3306,在你的代码中,它被称为127.0.0.1,这是本地主机,它总是只调用自己。所以如果我从api容器调用127.0.0.1,我就调用api
请尝试将其修改为:
create_engine("mysql+mysqlconnector://root:Roh1t#mishra@db:3306/finops")

更新日期:

删除停靠合成中的db.hostname: localhost
成功连接到数据库后,我附加了示例测试文件。
第一个
docker-compose logs的输出:

api_1  | FacadeDict({'tbl': Table('tbl', MetaData(bind=Engine(mysql://root:***@db:3306/my_db)), Column('id', INTEGER(), table=<tbl>, primary_key=True, nullable=False), Column('key', VARCHAR(length=20), table=<tbl>), Column('val', VARCHAR(length=20), table=<tbl>), schema=None)})

相关问题