使用 Python 连接到 MySQL 数据库可能会令人困惑。有几种不同的连接驱动程序,并非所有驱动程序都能与不同的操作系统很好地配合。最重要的是,启用 SSL 可能是一个挑战。
本文介绍了四种可用于将 Python 应用程序连接到 MySQL 的方法。这些示例将使用 PlanetScale,这是一个用于 MySQL 的无服务器数据库平台,但您连接的实际数据库是任意的。
将介绍以下连接方法:
- mysql客户端
- mysql-连接器-python
- PyMySQL
- aiomysql
设置 PlanetScale
如果您需要一个免费的数据库来测试您的连接,PlanetScale 是一个很好的选择。 PlanetScale 构建在 Vitess 之上,为您提供熟悉的分支工作流程来测试和部署架构更改。
Vitess 建于 2010 年,旨在解决 YouTube 的扩展问题。从那时起,开源项目不断发展,现在帮助 Slack 和 Square 等多家公司处理其海量数据扩展需求。
注册一个帐户以获得免费的 5GB 数据库。
创建数据库
进入 PlanetScale 仪表板后:
- 在您的组织概览仪表板上单击“创建新数据库”。
- 为您的数据库命名。
- 从下拉列表中选择一个区域。
- 单击创建数据库。
您的数据库将使用主开发分支创建。您可以在此处进行架构更改,并在准备好后将其升级到生产环境。
获取连接凭据
要生成连接凭据:
- 单击数据库概览页面上的“连接”。
- 从“连接方式”下拉列表中选择“Python”。
- 将凭据复制到 Python 应用程序文件夹中的 .env 文件中。
为了确保安全连接,PlanetScale 使用来自证书颁发机构 (CA) 的证书,该证书是几乎所有平台上可用的系统根目录的一部分。连接到数据库时,您必须指定您信任的 CA 证书的路径。请注意,此路径取决于您的平台。这是跨各种操作系统和发行版的常用路径列表。
如果您从 PlanetScale 仪表板复制了凭据,这应该已经为您完成,因为 PlanetScale 会自动检测您的操作系统。
如果您使用的是 Windows 系统,则需要下载根证书,然后使用您正在使用的驱动程序的正确配置选项指向它们的位置。
使用 mysqlclient 连接到 MySQL
mysqlclient 包是 MySQL 最流行的 Python 包之一。它包含 MySQLdb 模块,这是一个提供 Python 数据库 API 的 MySQL 接口。
首先安装mysqlclient。您可以通过两种方式做到这一点:
- 使用与您正在运行的操作系统和 SQL 版本相匹配的官方 MySQL 站点的安装程序。
- 使用 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 连接器连接到 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 应用程序。
原文标题:Connect to a MySQL database in Python
原文作者:Holly Guevara
原文地址:https://planetscale.com/blog/connect-to-a-mysql-database-in-python




