四种 Python 连接 MySQL 数据库的方法

用 Python 连接到 MySQL 数据库的方法不是很系统,实际中有几种不同的连接方法,而且不是所有的方法都能与不同的操作系统很好地配合。除此之外,启用SSL也是一个挑战。

本文涵盖了四种方法,你可以用它们来连接你的Python应用程序和MySQL。这些例子将使用PlanetScale,一个用于MySQL的无服务器数据库平台。

本文将涵盖以下连接方法:

  • mysqlclient
  • mysql-connector-python
  • PyMySQL
  • aiomysql

设置PlanetScale

如果你需要一个免费的数据库来测试你的连接,PlanetScale是一个很好的选择。PlanetScale建立在Vitess之上,为你提供一个熟悉的工作流程分支来测试和部署不同模式。

Vitess建于2010年,用于解决YouTube的扩展问题。从那时起,这个开源项目持续增长,现在帮助一些公司,如Slack和Square处理他们的大规模数据扩展需求。

你可以从下面注册一个账户,获得一个免费的5GB数据库。

https://auth.planetscale.com/sign-up

创建一个数据库

当你进入PlanetScale的仪表板。

  • 在你的组织概览仪表板上点击 “创建新数据库”。
  • 给你的数据库起个名字。
  • 从下拉菜单中选择一个区域。
  • 点击创建数据库。

你的数据库将被创建为一个主要的开发分支。你可以在这里进行模式修改,一旦你准备好了,就可以把它推广到生产中。

获取连接凭证

要生成连接凭证,必须做到以下步骤:

  • 在你的数据库概览页面上点击 “连接”。
  • 从 “连接方式 “下拉菜单中选择 “Python”。
  • 将凭证复制到你的Python应用程序文件夹中的.env文件。

为了确保连接的安全性,PlanetScale使用了来自证书颁发机构(CA)的证书,它是几乎所有平台上的系统根的一部分。当连接到数据库时,你必须指定你信任的CA证书的路径。注意,这个路径取决于你的平台。这里有一个跨越各种操作系统和发行版的常见路径列表。

https://planetscale.com/docs/concepts/secure-connections#ca-root-configuration

如果你从PlanetScale仪表板上复制了证书,你已经完成这一步,因为PlanetScale会自动检测你的操作系统。

如果你使用的是Windows系统,你需要下载根证书,然后用你所使用的驱动程序的正确配置选项指向它们的位置。

用mysqlclient连接到MySQL

mysqlclient包是用于MySQL的最流行的Python包之一。它包含MySQLdb模块,一个提供Python数据库API的MySQL接口。

  • 首先安装mysqlclient。你可以通过两种方式来完成这件事。
  • 使用来自MySQL官方网站的安装程序,它与你正在运行的操作系统和SQL版本相匹配。

使用 pip 来安装它。

pip install mysqlclient

在Linux上,你可能需要在安装mysqlclient之前安装Python3和MySQL开发头文件和库。

sudo apt-get install python3-dev default-libmysqlclient-dev build-essential

一旦你安装了mysqlclient,你可以使用下面的代码连接到数据库。

import os
import MySQLdb # import the MySQLdb module
from dotenv import load_dotenv
load_dotenv()

# Create the connection object
connection = MySQLdb.connect(
host=os.getenv("HOST"),
user=os.getenv("USERNAME"),
passwd=os.getenv("PASSWORD"),
db=os.getenv("DATABASE"),
ssl_mode="VERIFY_IDENTITY",
ssl={
'ca': os.getenv("SSL_CERT")
}
)

# Create cursor and use it to execute SQL command
cursor = connection.cursor()
cursor.execute("select @@version")
version = cursor.fetchone()

if version:
print('Running version: ', version)
else:
print('Not connected.')

注意,你必须安装 python-dotenv 并导入 os 模块以访问.env 文件中的数据库凭证。

Windows用户要注意,从wheel轮子文件中安装的mysqlclient不支持ssl模式。由于你想确保数据库连接是安全的,我们建议使用另一个驱动,比如mysql-connector-python。

这个例子使用连接来获取数据库的SQL版本,然后关闭连接。

其余的连接方法的语法与这个例子几乎相同。这种类似的语法源于 Python 数据库 API 规范 (PEP 249),它鼓励用于访问数据库的 Python 模块之间的一致性。

用MySQL connector连接到MySQL

MySQL connector/Python模块是Oracle支持的官方驱动,用于通过Python连接MySQL。该连接器完全是Python语言,而mysqlclient是用C语言编写的。它也是独立的,意味着它不需要MySQL客户端库或标准库以外的任何Python模块。

注意,MySQL Connector/Python不支持旧的MySQL服务器认证方法,这意味着4.1之前的MySQL版本不能工作。

首先安装mysql-connector-python模块。建议使用pip来安装它。

pip install mysql-connector-python

安装后,使用以下代码连接到MySQL:

import os
from dotenv import load_dotenv
from mysql.connector import Error
import mysql.connector

load_dotenv()

connection = mysql.connector.connect(
host=os.getenv("HOST"),
database=os.getenv("DATABASE"),
user=os.getenv("USERNAME"),
password=os.getenv("PASSWORD"),
ssl_ca=os.getenv("SSL_CERT")
)

try:
if connection.is_connected():
cursor = connection.cursor()
cursor.execute("select @@version ")
version = cursor.fetchone()
if version:
print('Running version: ', version)
else:
print('Not connected.')
except Error as e:
print("Error while connecting to MySQL", e)
finally:
connection.close()

用PyMySQL连接到MySQL

PyMySQL包是另一个连接器,你可以用它来连接Python和MySQL。如果你追求速度,这是一个很好的选择,因为它比mysql-connector-python快。

你可以使用 pip 来安装它。

pip install PyMySQL

然后,使用以下连接代码。

from dotenv import load_dotenv
import pymysql
import os
load_dotenv()
connection = pymysql.connect(
host=os.getenv("HOST"),
database=os.getenv("DATABASE"),
user=os.getenv("USERNAME"),
password=os.getenv("PASSWORD"),
ssl_ca=os.getenv("SSL_CERT")
)
cursor = connection.cursor()
cursor.execute("select @@version ")
version = cursor.fetchone()
if version:
print('Running version: ', version)
else:
print('Not connected.')
connection.close()

用aiomysql连接到MySQL

aiomysql库用于从asyncio框架访问MySQL数据库。除了是异步的特性之外,连接代码与PyMySQL相似。注意,使用aiomysql需要Python 3.7以上版本和PyMySQL。

要使用aiomysql,首先要用安装异步模块。

pip install asyncio

然后,用以下方法安装aiomysql。

pip install aiomysql

然后你可以使用以下代码连接到MySQL。

import os
import asyncio
import aiomysql
import ssl

from dotenv import load_dotenv
load_dotenv()

ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ctx.load_verify_locations(cafile=os.getenv("SSL_CERT"))

loop = asyncio.get_event_loop()

async def connect_db():
connection = await aiomysql.connect(
host=os.getenv("HOST"),
port=3306,
user=os.getenv("USERNAME"),
password=os.getenv("PASSWORD"),
db=os.getenv("DATABASE"),
loop=loop,
ssl=ctx
)
cursor = await connection.cursor()
await cursor.execute("select @@version")
version = await cursor.fetchall()
print('Running version: ', version)
await cursor.close()
connection.close()
loop.run_until_complete(connect_db())

总结

在数据库中保存数据是应用程序的共同特征之一。像Python一样,大多数编程语言支持与不同数据库的连接和交互。本教程探讨了Python与MySQL的连接。

我们分享了可以使用的四种不同的常用连接方法,并在PlanetScale数据库上使用SSL对它们进行了测试,这是一个关键的步骤,因为它可以防止中间人攻击。我们回顾了每个连接方式的连接器是如何工作的,并展示了运行它所需的代码。现在你已经完成了这个实践概述,你已经准备好将MySQL数据库连接到Python应用程序中了。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/230347.html<

(0)
运维的头像运维
上一篇2025-04-19 04:47
下一篇 2025-04-19 04:49

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注