首页 > 编程问答 >Python MySQL 无法连接,原因不明

Python MySQL 无法连接,原因不明

时间:2024-07-30 10:57:37浏览次数:12  
标签:python mysql dockerfile localhost

当我尝试使用 python 连接到我的 MySQL 数据库时,由于未知原因显示错误:

dTraceback (most recent call last):
  File "/usr/local/bin/flask", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 1105, in main
    cli.main()
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/decorators.py", line 92, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 953, in run_command
    raise e from None
  File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 937, in run_command
    app: WSGIApplication = info.load_app()
                           ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 335, in load_app
    app = locate_app(import_name, name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/flask/cli.py", line 245, in locate_app
    __import__(module_name)
  File "/app/main.py", line 2, in <module>
    import sql_code
  File "/app/sql_code.py", line 4, in <module>
    mydb = mysql.connector.connect(
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/mysql/connector/pooling.py", line 322, in connect
    return CMySQLConnection(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/mysql/connector/connection_cext.py", line 151, in __init__
    self.connect(**kwargs)
  File "/usr/local/lib/python3.12/site-packages/mysql/connector/abstracts.py", line 1399, in connect
    self._open_connection()
  File "/usr/local/lib/python3.12/site-packages/mysql/connector/connection_cext.py", line 339, in _open_connection
    raise get_mysql_exception(
mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (99)

这些是 python 连接器的文件(针对敏感信息的审查进行了修改)

mydb = mysql.connector.connect(
    host="localhost",
    user="USERNAME_DATABASE",
    password="root_pass",
    database="mydatabase"
)

和修改后的 MYSQL 文件 (docker ):

FROM mysql:latest

WORKDIR /app

ADD . /app

COPY ./ex_db.sql /docker-entyypoint-initdb.d/

ENV MYSQL_HOST=localhost

ENV MYSQL_USER=USERNAME_DATABASE

ENV MYSQL_ROOT_PASSWORD=root_pass

ENV MYSQL_PASSWORD=pass

ENV MYSQL_DATABASE=mydatabase

EXPOSE 3306

两者都在最新版本的 docker 中运行

上面的代码应该可以无错误地连接


错误信息 "Can't connect to MySQL server on 'localhost:3306' (99)" 意味着你的 Python 代码无法连接到运行在 localhost:3306 的 MySQL 服务器。

以下是一些可能的原因和解决方法:

1. MySQL 服务未运行:

  • 确保你的 MySQL 服务器正在 Docker 容器内运行。你可以使用以下命令检查:

bash docker ps

如果 MySQL 容器没有运行,使用以下命令启动它:

bash docker-compose up -d

  • 如果你没有使用 docker-compose,可以使用以下命令启动容器: bash docker run -d -p 3306:3306 --name some-mysql -e MYSQL_ROOT_PASSWORD=root_pass -e MYSQL_DATABASE=mydatabase -e MYSQL_USER=USERNAME_DATABASE -e MYSQL_PASSWORD=pass mysql:latest

2. 网络连接问题:

  • 确保你的 Python 代码和 MySQL 容器在同一个 Docker 网络中。

    • 你可以使用 docker network create my-network 创建一个新的网络。
    • 然后,在启动 Python 容器和 MySQL 容器时,使用 --network my-network 选项将它们连接到同一个网络。
  • 如果你没有使用 Docker 网络,请确保你的 Python 代码可以访问 localhost:3306

    • 你可以使用 telnet localhost 3306 命令测试连接。
    • 如果你在不同的机器上运行代码,请将 localhost 替换为 MySQL 服务器的 IP 地址。

3. 防火墙问题:

  • 确保你的防火墙没有阻止对 3306 端口的访问。
  • 尝试暂时禁用防火墙,看看是否能解决问题。

4. 错误的凭据:

  • 仔细检查你的 Python 代码中使用的用户名、密码和数据库名称是否与 MySQL 容器中的配置一致。
  • 特别注意,你的 Python 代码应该使用 MYSQL_USER MYSQL_PASSWORD 环境变量的值,而不是 MYSQL_ROOT_PASSWORD

5. MySQL 用户权限问题:

  • 确保你用来连接的 MySQL 用户有权访问指定的数据库。
  • 你可以使用以下命令连接到 MySQL 服务器,并检查用户权限:

bash docker exec -it <mysql_container_id> mysql -u root -p

然后,运行以下命令查看用户权限:

sql SHOW GRANTS FOR 'USERNAME_DATABASE'@'%';

6. 连接池问题

  • 如果你使用了数据库连接池,请确保连接池配置正确,并且连接池中的连接没有被耗尽。

调试建议:

  • 在你的 Python 代码中添加 print(mydb) 语句,查看连接对象是否成功创建。
  • 打印连接对象的错误信息: print(mydb.error)

请仔细检查以上所有步骤,并根据你的环境进行调整。

标签:python,mysql,dockerfile,localhost
From: 78809644

相关文章

  • 基于Python Django的旅游景点数据分析与推荐系统
    基于PythonDjango的旅游景点数据分析与推荐系统。源码+数据库+文档(LW)。开发技术:Pythondjangomysql。项目内容:系统包括多个功能模块,涵盖了用户管理、旅游景点管理、管理员管理、系统管理等方面,以及一些其他辅助功能和信息展示模块。用户管理模块允许管理员管理系统中的用......
  • django基于Python的校园个人闲置物品换购平台
    django基于Python的校园个人闲置物品换购平台。源码+数据库+文档(lw+ppt)。开发技术:Pythondjangomysql。项目内容:系统主要包括主页、个人中心、用户管理、景点信息管理、系统管理等功能。    ......
  • Python的使用技巧整理——100个Python使用技巧代码和运行结果(上)
    整理一些更实用的Python编程技巧,这些技巧将涵盖性能优化、代码简洁性、调试和测试等方面,并提供具体的代码示例和结果。以下是详细的内容:1.列表生成表达式列表生成表达式不仅简洁,还能提高性能。#示例代码squares=[x**2forxinrange(10)]print(squares)运行结果:[......
  • MySQL 主从复制,常见的binlog错误及解决方法
    在主从复制架构下,MySQL通过binlog来实现主从数据的一致性。 MySQL主从复制主要有以下步骤1.master将改变记录到binarylog中2.slaveio_thread去请求主库的binlog,并将得到的binlog日志写到relaylog中3.slavesql_thread重做relaylog中的事件 除了作为MySQL主从复制......
  • Python 缓存工具统计并使用自定义密钥
    我正在寻找一种方法来使用python的cachetools内置缓存库功能,但也支持命中/未命中统计,使用自定义键函数,并且如果可能的话支持无界缓存?不幸的是,我可以只能找到这些方法:如果我想使用未绑定的缓存,并有命中/未命中统计:fromcachetools.funcimportlru_cache......
  • 如何用Python从PDF文件中抓取数据
    我想抓取此PDF第7页中的数据,然后移至数据框,然后移至CSV。您能提供同样的帮助吗?当然,我可以帮。以下是用Python从PDF文件中抓取数据并将数据保存到CSV文件的步骤:1.安装必要的库需要安装以下Python库:PyPDF2:用于读取P......
  • python读取大型二进制文件最有效的方法是什么
    我有一个大(21GB)文件,我想将其读入内存,然后传递给一个子例程,该子例程对我透明地处理数据。我在Centos6.5上使用python2.6.6,因此无法升级操作系统或python。目前,我正在使用f=open(image_filename,"rb")image_file_contents=f.read()f.close()transparent_subrout......
  • Python:为列表中的每个类对象创建一个不同的副本
    如何制作Python类中对象列表的副本,以便每个副本都是所述Python类的不同实例?假设我有一个Python类classmyClass():def__init__(self,neighbor):self.neighbor=neighbor另外假设myList=[a,b,c,d,...]是一个列表myClass对......
  • 需要使用Python代码将一个文件的一部分复制到另一个文件的相同但空的部分
    例如:需要将文件A中第1部分的x、y和z行复制到文件B中括号之间的第1部分。需要帮助,如果给定多个文件,文件A部分1中的行数将是更改,因此总是需要在括号之间复制到括号之间。文件A:Section1{xyz}Section2{abc}文件B:Section1{}S......
  • 十分钟教你学会 MySQL字符串处理
    CONCAT函数在Java语言中,我们经常会对字符串进行处理,在ySQL中,我们同样也有这样的函数来处理字符串,这节课我们来学习CONCAT函数。语法我们来看一下concat函数的语法:SELECTcolumn_name1,CONCAT(column_name2,str,column_name3),column_name4FROMtable_name;我们来分析......