Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
python中怎么连接MySQL数据库_Python使用PyMySQL连接MySQL数据库教程_创想鸟

python中怎么连接MySQL数据库_Python使用PyMySQL连接MySQL数据库教程

答案:使用PyMySQL连接MySQL是Python中最常用且推荐的方式,因其纯Python实现、兼容性好、安装简便且支持DB-API 2.0规范。通过pymysql.connect()建立连接,配合参数化查询防止SQL注入,使用DictCursor获取字典结果,并在异常处理中确保连接关闭。实际项目中应采用连接池提升性能,避免频繁创建连接;敏感信息需通过环境变量管理,不硬编码;字符集设为utf8mb4以支持中文和Emoji;常见问题如连接拒绝、权限错误、数据库不存在等可通过检查服务状态、网络连通性、用户权限及日志逐步排查。

python中怎么连接mysql数据库_python使用pymysql连接mysql数据库教程

Python连接MySQL数据库,最常用且推荐的方式就是通过第三方库PyMySQL。它提供了一套符合Python DB-API 2.0规范的接口,让开发者可以像操作其他数据库一样,方便地与MySQL进行交互,包括建立连接、执行SQL查询、插入、更新数据以及获取结果集。本质上,PyMySQL扮演了一个翻译官的角色,将Python代码的指令转换为MySQL服务器能理解的协议,再将服务器的响应传回给Python。

解决方案

使用PyMySQL连接MySQL数据库的核心流程相对直接。首先需要安装PyMySQL库,通常通过

pip install PyMySQL

完成。之后,代码层面主要是导入库、建立连接、创建游标、执行SQL、提交事务(如果需要)以及关闭连接和游标。

一个典型的连接和查询示例大概是这样的:

import pymysql# 数据库连接参数,通常建议从配置文件或环境变量中读取,避免硬编码DB_HOST = 'localhost'DB_USER = 'your_username'DB_PASSWORD = 'your_password'DB_NAME = 'your_database'DB_PORT = 3306 # MySQL默认端口connection = None # 初始化连接变量try:    # 建立数据库连接    connection = pymysql.connect(        host=DB_HOST,        user=DB_USER,        password=DB_PASSWORD,        database=DB_NAME,        port=DB_PORT,        charset='utf8mb4', # 确保字符集正确处理中文或特殊字符        cursorclass=pymysql.cursors.DictCursor # 返回字典类型结果,方便按字段名访问    )    # 创建一个游标对象,用于执行SQL命令    # 默认是TupleCursor,这里使用了DictCursor    with connection.cursor() as cursor:        # 执行一个简单的查询        sql_query = "SELECT id, name, email FROM users WHERE status = %s"        cursor.execute(sql_query, ('active',)) # 参数化查询,防止SQL注入        # 获取所有查询结果        results = cursor.fetchall()        print("查询结果:")        for row in results:            print(f"ID: {row['id']}, Name: {row['name']}, Email: {row['email']}")        # 也可以执行插入、更新、删除等操作        # insert_sql = "INSERT INTO products (name, price) VALUES (%s, %s)"        # cursor.execute(insert_sql, ('New Product', 99.99))        # connection.commit() # 提交事务,确保更改生效        # print(f"插入了 {cursor.rowcount} 条数据")except pymysql.Error as e:    print(f"数据库操作失败: {e}")    # 可以根据错误类型进行更细致的处理,比如重试或记录日志finally:    # 无论如何,确保关闭数据库连接    if connection:        connection.close()        print("数据库连接已关闭。")

这段代码展示了从连接到查询、结果处理的完整流程。关键在于

pymysql.connect()

方法中的参数配置,特别是

charset

和

cursorclass

,它们对数据处理和结果返回格式至关重要。

立即学习“Python免费学习笔记(深入)”;

PyMySQL相比其他Python MySQL库有什么优势?

在Python生态中,连接MySQL的库并不少,比如官方的

mysql-connector-python

、老牌的

MySQLdb

等。我个人在多数项目中更倾向于选择PyMySQL,主要有以下几个考量:

首先,纯Python实现是PyMySQL的一大亮点。这意味着它不需要编译C扩展,安装过程通常更为顺畅,尤其是在一些没有C编译器或者编译环境配置复杂的系统上,这能省去不少麻烦。相比之下,

MySQLdb

就需要依赖

mysqlclient

,而

mysqlclient

在安装时可能需要系统安装MySQL开发库。

其次,兼容性好。PyMySQL同时支持Python 2和Python 3,尽管现在Python 2已经不推荐使用,但对于一些遗留项目来说,这种兼容性仍然有价值。更重要的是,它严格遵循Python DB-API 2.0规范,这意味着如果你熟悉这个API,切换到PyMySQL几乎没有学习成本,代码的可移植性也更强。

再者,活跃的社区支持和维护。一个库的生命力很大程度上取决于其社区活跃度。PyMySQL在这方面做得不错,遇到问题时,通常能在GitHub或Stack Overflow上找到解决方案或讨论。

mysql-connector-python

作为官方库,虽然功能全面,但有时感觉有点“重”,而PyMySQL则显得更轻量、更灵活。

当然,选择哪个库最终还是取决于项目具体需求和个人偏好。但就我经验来看,对于大多数常规的Web应用或数据处理任务,PyMySQL通常是一个开箱即用、表现可靠的优秀选择。

在实际项目中,如何更安全、高效地管理数据库连接?

实际项目中的数据库连接管理,远不止简单地

connect()

和

close()

。这涉及到安全性、性能和资源利用率等多个方面,做得好坏直接影响应用的稳定性和扩展性。

1. 连接池(Connection Pooling)是性能基石。频繁地建立和关闭数据库连接是非常耗费资源的。每次建立连接都需要进行网络握手、身份验证等操作,这会显著增加请求延迟。连接池的作用就是预先创建一定数量的数据库连接,并将它们放入一个池子中。当应用需要连接时,直接从池中获取一个可用的连接;使用完毕后,将连接归还给池,而不是真正关闭。这样就大大减少了连接创建和销毁的开销。在Python中,可以考虑使用

DBUtils

这样的库,或者自己实现一个简单的连接池管理类。没有连接池,高并发场景下你的应用很快就会因为数据库连接耗尽或响应缓慢而崩溃。

2. 参数化查询(Parameterized Queries)是安全底线。SQL注入是数据库安全中最常见的威胁之一。永远不要直接将用户输入拼接到SQL语句中!PyMySQL和其他DB-API 2.0兼容的库都支持参数化查询。例如,

cursor.execute("SELECT * FROM users WHERE username = %s", (username_from_input,))

。PyMySQL会自动处理参数的转义,有效防止恶意代码的注入。这是必须遵循的实践,没有之一。

3. 严谨的错误处理和资源释放。数据库操作总会遇到各种异常,比如网络中断、数据库宕机、SQL语法错误等。使用

try...except...finally

结构来捕获异常,并在

finally

块中确保连接和游标被正确关闭,即使发生错误也要释放资源,避免连接泄露。连接泄露会导致连接池耗尽,最终使应用无法再连接数据库。

4. 敏感信息(如数据库凭据)的安全管理。数据库的用户名、密码等敏感信息绝不能硬编码在代码中,也不能直接提交到版本控制系统。最佳实践是使用环境变量、配置文件(且配置文件本身不应公开)或专门的密钥管理服务来存储和获取这些信息。例如,通过

os.getenv('DB_PASSWORD')

来获取密码,或者使用

python-dotenv

等库来加载

.env

文件。

这些实践并非高深莫测,但却是构建健壮、安全、高性能应用不可或缺的环节。

遇到连接MySQL的常见问题及调试技巧有哪些?

在使用PyMySQL连接MySQL时,总会遇到一些让人头疼的问题,有时候一个微小的配置错误就能让你抓狂。我总结了一些常见的痛点和我的调试思路:

1.

Can't connect to MySQL server on 'host' (111)

或类似的连接拒绝错误。这是最常见的连接问题,通常意味着客户端无法与MySQL服务器建立网络连接。

检查MySQL服务状态: 确保MySQL服务器正在运行。在Linux上,

sudo systemctl status mysql

或

sudo service mysql status

。检查主机和端口: 确认

host

参数(如

localhost

或IP地址)和

port

参数(默认3306)是否正确。尤其是在Docker容器或云环境中,

localhost

可能不再适用,需要使用容器名或服务IP。网络连通性: 尝试从客户端机器

ping

MySQL服务器的IP地址,或者使用

telnet  

(如

telnet localhost 3306

)来测试端口是否开放。如果

telnet

失败,可能是防火墙阻止了连接。防火墙规则: 检查服务器端的防火墙(如

ufw

或

firewalld

)是否允许来自客户端IP的3306端口连接。

2.

Access denied for user 'user'@'host'

错误。这意味着用户名或密码不正确,或者该用户没有从你的客户端IP地址连接的权限。

核对用户名和密码: 确认连接字符串中的

user

和

password

是否与MySQL数据库中设置的完全一致。大小写敏感性也需要注意。检查用户权限: 登录到MySQL服务器,使用

SELECT user, host FROM mysql.user;

查看用户列表,并使用

SHOW GRANTS FOR 'your_username'@'your_host';

检查该用户是否有从

your_host

连接的权限。

your_host

可以是

localhost

、

%

(表示任意主机)或特定的IP地址。如果用户只能从

localhost

连接,而你的应用是从远程连接,就会出现这个错误。

3.

Unknown database 'db_name'

错误。这个比较直接,就是你指定的数据库名不存在,或者打错了。

确认数据库名: 登录MySQL,使用

SHOW DATABASES;

命令核对数据库名称。

4. 字符编码问题,如中文乱码。数据插入或查询时出现乱码,往往是字符编码不一致造成的。

PyMySQL连接参数: 在

pymysql.connect()

中明确指定

charset='utf8mb4'

。

utf8mb4

是

utf8

的超集,能更好地支持Emoji等特殊字符。数据库和表编码: 确保MySQL数据库、表和字段的字符集都是

utf8mb4

。可以通过

SHOW CREATE DATABASE your_database;

和

SHOW CREATE TABLE your_table;

来检查。客户端环境: 确保你的Python脚本文件本身也是以UTF-8编码保存的。

调试技巧:

逐步打印连接参数: 在

pymysql.connect()

之前,

print

出你正在使用的

host

、

user

、

password

、

database

、

port

等参数,确保它们是预期的值。MySQL日志: 检查MySQL服务器的错误日志(通常在

/var/log/mysql/error.log

或

/var/log/mysqld.log

),它会记录连接失败或权限拒绝的详细信息。使用命令行工具测试: 在出现问题的客户端机器上,尝试使用MySQL客户端命令行工具(

mysql -h  -u  -p  -P  -D 

)进行连接,如果命令行也无法连接,那问题肯定出在网络、权限或MySQL服务本身,与Python代码无关。

遇到问题时,保持冷静,一步步排查,通常都能找到根源。这些经验都是在无数次“为什么连不上”的挣扎中总结出来的。

以上就是python中怎么连接MySQL数据库_Python使用PyMySQL连接MySQL数据库教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1372494.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用 Python 通过 WhatsApp API 自动发送消息
上一篇 2025年12月14日 12:22:29
使用 Python 通过 WhatsApp API 发送消息:自动化教程
下一篇 2025年12月14日 12:22:40

相关推荐

  • MySQL安装时端口冲突如何解决?

    MySQL安装时端口冲突如何解决?MySQL安装时端口冲突如何解决?MySQL安装时端口冲突如何解决?MySQL安装时端口冲突如何解决?

    mysql安装时3306端口冲突的解决方法有两类:1.修改mysql默认端口;2.找出并停止占用端口的进程。在安装过程中可通过mysql安装向导直接修改端口号,或安装后编辑配置文件my.ini(windows)或my.cnf(linux)中的port参数,并重启mysql服务生效。若确认3306应为…

    2026年9月22日 • 用户投稿
    700
  • Linux进程调度学习!

    进程调度决定了哪个进程将被执行以及执行的时间,操作系统通过合理的进程调度实现资源的最大化利用。 在单片机上,常见的方式是系统初始化后进入 while(1){} 循环。当然,单片机也可以运行类似 FreeRTOS 的系统,从而实现进程切换。 在带有操作系统的 CPU 上运行的逻辑是允许多个进程(实际上…

    2026年9月22日
    000
  • ​​VSCode高手才知道的骚操作!学会这些技巧开发快人一步​​

    掌握VSCode效率核心在于命令面板、自定义快捷键、多光标编辑、代码片段与扩展生态;通过减少鼠标依赖、实现快速跳转与自动化操作,构建专属高效开发环境,让注意力聚焦于代码思维而非工具操作。 VSCode里那些让你效率翻倍的“骚操作”,本质上是将开发流程中的重复性、高频操作进行极致的简化与自动化。它不是…

    2026年9月22日
    300
  • PHP中操作JSON数组对象:添加与修改属性的实践指南

    本教程详细阐述如何在php中高效地处理包含对象的json数组。我们将学习如何利用`json_decode()`将json字符串转换为php数据结构,进而为数组中的现有对象添加或修改属性,并通过`json_encode()`将其转换回json字符串,避免手动构建json的常见错误。 在现代Web开发中…

    2026年9月22日
    1200
  • 实现Java双向路径搜索的正确方法

    本文旨在帮助开发者理解并正确实现Java中的双向路径搜索算法。通过分析常见的实现错误,我们将提供一种清晰、可行的解决方案,并详细解释如何构建完整的路径,克服单向搜索树的局限性,从而实现从起点到终点的完整路径搜索。 双向路径搜索是一种优化路径搜索效率的策略,它同时从起点和终点开始搜索,并在中间相遇。然…

    2026年9月22日
    900
  • VSCode设置Markdown写作环境(实用技巧,排版美化指南)

    要在vscode里打造舒服又高效的markdown写作环境,答案是通过安装核心扩展并进行个性化配置来实现;需安装markdown all in one、markdown preview enhanced、prettier和paste image等扩展,结合settings.json中的编辑器设置、自…

    2026年9月22日
    100
  • 好用的终端复用神器-Tmux

    好用的终端复用神器-Tmux好用的终端复用神器-Tmux好用的终端复用神器-Tmux好用的终端复用神器-Tmux

    前言 许久之前就听说过tmux,但是一直没上手,直到最近需要一直在linux下完成一些任务,我才切实感受到了tmux的优点:任意分屏、保存工作 就单单这两点,就足够实用了。分屏,曾今还十分痴迷i3wm和dwm这样的窗口管理工具,尤其是dwm的操作逻辑,大大提升linux工作效率。其他详情可以查看阮一…

    2026年9月22日 • 用户投稿
    100
  • LINUX如何比较两个文件的差异_Linux使用diff命令比较文件差异

    diff命令用于比较文件差异,基本用法为diff file1 file2,输出显示修改、添加或删除的行;结合-u、-i、-w等选项可提升可读性,常用于比较配置文件、代码版本、生成补丁(diff -u生成.patch文件)及验证文件一致性。 在Linux系统中,比较两个文件的差异是日常运维、开发和配置…

    2026年9月22日
    000
  • VS Code启动优化:扩展延迟加载与缓存策略

    合理管理扩展加载与缓存可显著提升VS Code启动速度。通过配置activationEvents实现按需激活、利用Extension Storage和CachedDataDir优化数据读取,并禁用非核心扩展,结合“Developer: Show Running Extensions”分析耗时,有效缩…

    2026年9月22日
    000
  • Java项目类路径管理:引用与实现外部.class文件定义的接口

    在Java项目中引用并实现由.class文件定义的接口,核心在于正确配置Java的类路径(Classpath)。本文将详细介绍类路径的概念、其重要性,以及如何在命令行和集成开发环境(IDE)中有效地设置类路径,确保编译器和JVM能够找到所需的.class文件,从而成功编译和运行包含外部接口实现的代码…

    2026年9月22日
    000
  • VSCode一键配置Rust:中文文档、语法高亮、Cargo集成

    安装Rust Analyzer扩展是VS Code配置Rust开发环境的核心,它提供语法高亮、智能补全、错误提示、定义跳转、Cargo集成等功能,并通过本地中文文档组件支持中文提示,实现开箱即用的高效开发体验。 VS Code配置Rust开发环境,尤其是要兼顾中文文档、语法高亮和Cargo项目管理,…

    2026年9月22日
    100
  • MAC上的虚拟机哪个最好用_MAC虚拟机软件推荐

    首选Parallels Desktop,因其在Mac上性能卓越、集成度高,适合运行Windows及图形密集型应用;UTM作为开源替代方案,基于QEMU,支持多系统且可定制性强,适合技术爱好者;VMware Fusion稳定性强,尤其适合企业级Linux虚拟化需求。三者均需通过ISO镜像安装系统,并推…

    2026年9月22日
    000
  • 动手实验+源码分析,彻底弄懂 Linux 网络命名空间

    动手实验+源码分析,彻底弄懂 Linux 网络命名空间动手实验+源码分析,彻底弄懂 Linux 网络命名空间动手实验+源码分析,彻底弄懂 Linux 网络命名空间动手实验+源码分析,彻底弄懂 Linux 网络命名空间

    大家好,我是飞哥! 在 Linux 上通过 veth 我们可以创建出许多的虚拟设备。通过 Bridge 模拟以太网交换机的方式可以让这些网络设备之间进行通信。不过虚拟化中还有很重要的一步,那就是隔离。借用 Docker 的概念来说,那就是不能让 A 容器用到 B 容器的设备,甚至连看一眼都不可以。只…

    2026年9月22日 • 用户投稿
    000
  • VSCode安装C/C++插件 小白必备VSCode配置C语言教程

    安装C/C++插件并配置MinGW编译器,通过tasks.json和launch.json文件设置编译调试任务,可使VSCode支持C语言开发;若插件异常,需检查环境变量、文件路径及语法,必要时重启或重装;中文乱码可通过设置UTF-8编码、使用集成终端或程序内setlocale解决;远程开发需配合R…

    2026年9月22日
    000
  • 电脑win11使用vnc连接手机ubuntu

    电脑win11使用vnc连接手机ubuntu电脑win11使用vnc连接手机ubuntu电脑win11使用vnc连接手机ubuntu电脑win11使用vnc连接手机ubuntu

    由于互联需要,使用vnc,手机端开发代码太伤眼睛了。 www.realvnc.com/en/connect/download/viewer/ 选择standalone exe x64,试一试看看??? 使用版本VNC-Viewer-6.21.1109-Windows-64bit。 双击打开,同意条款…

    2026年9月22日 • 用户投稿
    100
  • ​​VSCode的隐藏神技大公开!这些操作让你的编程效率突破天际​​

    vscode的真正效率提升源于掌握其核心功能与高级特性。首先要善用命令面板(ctrl/cmd + shift + p),它能快速执行格式化、打开文件、运行任务等操作,避免在菜单中层层查找;其次,多光标编辑(如alt+点击或ctrl/cmd + d)可实现批量修改,极大提升重构效率;通过tasks.j…

    2026年9月22日
    100
  • win11找不到网络打印机怎么解决_win11网络打印机无法发现解决方法

    首先启用网络发现和打印机共享,检查Print Spooler等服务状态,通过UNC路径手动添加打印机,确认组策略设置正确,并更新或重新安装最新驱动程序以解决局域网内无法搜索到共享打印机的问题。 如果您在局域网内无法搜索到已共享的打印机,可能是由于网络发现、服务或防火墙设置导致设备无法被探测到。以下是…

    2026年9月22日
    100
  • Docker的安装与卸载

    Docker的安装与卸载Docker的安装与卸载Docker的安装与卸载Docker的安装与卸载

    docker并不是一个通用的容器工具,它依赖于linux内核环境。实际上,docker是在运行的linux系统下创建一个隔离的文件环境,因此它的执行效率几乎与宿主环境相当。因此,在windows上部署docker需要先安装wsl子系统来提供linux环境,然后才能安装docker。 Docker由三…

    2026年9月22日 • 用户投稿
    100
  • VSCode如何配置Rust开发环境 VSCode搭建Rust项目的详细步骤

    安装rust工具链需在终端运行curl –proto ‘=https’ –tlsv1.2 https://sh.rustup.rs -ssf | sh,安装完成后重启终端或执行source $home/.cargo/env,并通过rustc &#821…

    2026年9月22日
    000
  • 如何配置Linux用户密码复杂度 pam_pwquality设置

    如何配置Linux用户密码复杂度 pam_pwquality设置如何配置Linux用户密码复杂度 pam_pwquality设置如何配置Linux用户密码复杂度 pam_pwquality设置如何配置Linux用户密码复杂度 pam_pwquality设置

    linux系统需要配置密码复杂度以提高安全性,防止弱密码被暴力破解或字典攻击。核心方法是通过编辑/etc/security/pwquality.conf文件并确保pam_pwquality.so模块被正确加载。1. 配置pwquality.conf设置minlen(最小长度)、dcredit/ucr…

    2026年9月22日 • 用户投稿
    300

发表回复

登录后才能评论
关注微信