在数据驱动的时代,Python因其简洁性和强大的库生态,已成为与数据库交互的首选语言之一,无论是构建Web应用、进行数据分析,还是实现自动化任务,掌握python 怎么连接数据库都是一项必备技能,本文将系统性地介绍这一过程,从核心概念到具体实践,帮助您轻松上手。

核心概念:数据库驱动程序
Python本身并不直接“认识”各种数据库,它需要一个“翻译官”或“桥梁”,这就是数据库驱动程序,驱动程序是一个特定的库,它实现了Python的数据库API规范(DB-API 2.0),使得Python代码可以用一套相对标准化的方式与不同类型的数据库(如MySQL, PostgreSQL, SQLite等)进行通信,连接数据库的第一步,就是为您的目标数据库安装正确的驱动程序。
通用连接步骤
尽管不同数据库的驱动程序略有差异,但连接和操作的基本流程遵循一个统一的生命周期模式。
- 安装驱动:使用
pip命令安装对应数据库的驱动库。 - 导入模块:在Python脚本中导入已安装的驱动模块。
- 建立连接:调用驱动的
connect()函数,并提供必要的认证信息,如主机名、用户名、密码、数据库名称和端口号,此函数会返回一个连接对象(Connection Object)。 - 创建游标:通过连接对象创建一个游标对象(Cursor Object),游标是执行SQL命令和遍历结果集的工具,可以理解为指向数据结果的指针。
- 执行SQL:使用游标的
execute()方法来执行SQL语句(如SELECT,INSERT,UPDATE,DELETE)。 - 获取结果:如果执行的是查询语句,可以使用游标的
fetchone()(获取一行)、fetchall()(获取所有行)或fetchmany()(获取指定行数)方法来获取数据。 - 关闭资源:操作完成后,务必关闭游标和连接,以释放数据库资源,这是一个非常重要的步骤,否则可能导致资源泄露。
常见数据库连接实例
下面以三种主流数据库为例,展示具体的连接代码。
连接MySQL
首先安装驱动:pip install mysql-connector-python
import mysql.connector
try:
# 建立连接
conn = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database"
)
# 创建游标
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT VERSION()")
# 获取结果
db_version = cursor.fetchone()
print(f"数据库版本: {db_version[0]}")
except mysql.connector.Error as err:
print(f"错误: {err}")
finally:
# 关闭游标和连接
if 'cursor' in locals() and cursor is not None:
cursor.close()
if 'conn' in locals() and conn.is_connected():
conn.close()
连接PostgreSQL
首先安装驱动:pip install psycopg2-binary

import psycopg2
try:
# 建立连接
conn = psycopg2.connect(
host="localhost",
user="your_username",
password="your_password",
dbname="your_database"
)
# 创建游标
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT version();")
# 获取结果
db_version = cursor.fetchone()
print(f"数据库版本: {db_version[0]}")
except psycopg2.Error as err:
print(f"错误: {err}")
finally:
# 关闭游标和连接
if 'cursor' in locals() and cursor is not None:
cursor.close()
if 'conn' in locals() and conn is not None:
conn.close()
连接SQLite
SQLite是Python内置的,无需安装额外驱动,非常适合小型应用和本地开发。
import sqlite3
# 连接到数据库文件(如果不存在则会创建)
conn = sqlite3.connect('example.db')
# 创建游标
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT sqlite_version();")
# 获取结果
db_version = cursor.fetchone()
print(f"SQLite版本: {db_version[0]}")
# 关闭游标和连接
cursor.close()
conn.close()
为了方便查阅,下表小编总结了常用数据库及其驱动:
| 数据库 | 推荐驱动 | 安装命令 |
|---|---|---|
| MySQL | mysql-connector-python |
pip install mysql-connector-python |
| PostgreSQL | psycopg2-binary |
pip install psycopg2-binary |
| SQLite | sqlite3 (内置) |
无需安装 |
| SQL Server | pyodbc |
pip install pyodbc |
最佳实践与注意事项
为了编写更安全、更健壮的数据库代码,请遵循以下最佳实践。
-
使用
with语句管理资源:with语句可以自动处理资源的关闭,即使在代码块中发生异常,也能确保连接和游标被正确关闭,是首选的资源管理方式。import mysql.connector config = {...} # 连接配置 try: with mysql.connector.connect(**config) as conn: with conn.cursor() as cursor: cursor.execute("SELECT * FROM users") results = cursor.fetchall() # 处理结果 except mysql.connector.Error as err: print(f"发生错误: {err}") -
使用参数化查询防止SQL注入:永远不要直接使用字符串格式化(如f-string或)来构建SQL查询,这会使您的应用程序面临SQL注入攻击的巨大风险,应使用参数化查询,将变量作为参数传递给
execute方法。
# 危险的方式 - 切勿使用! user_id = "1 OR 1=1" # cursor.execute(f"SELECT * FROM users WHERE id = {user_id}") # 安全的方式 - 使用参数化查询 user_id = 1 sql = "SELECT * FROM users WHERE id = %s" cursor.execute(sql, (user_id,)) # 注意参数是一个元组
相关问答FAQs
Q1: 连接数据库时,最常见的错误是什么,如何解决?
A: 最常见的错误是认证失败,通常是Access denied for user,这表示您提供的用户名或密码不正确,或者该用户没有从您的主机访问该数据库的权限,请检查连接参数中的user, password, host是否准确无误,其次是网络连接问题,如Can't connect to MySQL server,请确保数据库服务正在运行,并且防火墙没有阻止相应的端口。
Q2: 为什么推荐使用参数化查询而不是直接拼接SQL字符串?
A: 主要是为了安全,直接拼接SQL字符串会使应用程序极易受到SQL注入攻击,攻击者可以通过输入精心构造的字符串(如' OR '1'='1)来篡改原始SQL逻辑,从而绕过身份验证、窃取或破坏数据,参数化查询将SQL代码和数据严格分开,数据库驱动会负责对数据进行正确的转义和处理,确保数据只作为数据对待,从根本上杜绝了SQL注入的风险。