核心结论先说清楚
python3连接数据库服务器的本质,是安装对应驱动、建立连接对象、执行游标操作、关闭连接这四个步骤的循环。无论你连的是MySQL、PostgreSQL还是SQL Server,底层逻辑完全一致,区别只在于驱动包的安装方式和连接参数的写法,本文用MySQL作为主线演示,其他数据库的差异点单独列出,方便你直接对照使用。
连接前的准备工作:环境与驱动选择
确认Python版本与包管理器
大多数Linux服务器和Windows开发机上已经预装Python3,但版本新旧差异较大,命令行执行python3 --version确认版本号,2026年主流生产环境多半运行在3.8以上,低于3.8的建议升级,包管理器方面,pip和pip3的区分要留意有些系统里pip指向Python2,务必用pip3操作,否则装完驱动后Python3依旧提示找不到模块。
驱动库不是随便装一个就完事
不同数据库对应不同驱动,选错等于白装,以最常用的几个为例:MySQL对应pymysql或mysql-connector-python,PostgreSQL对应psycopg2,SQL Server对应pyodbc,Oracle对应oracledb或cx_Oracle,行业共识认为,pymysql因为纯Python实现、无需编译依赖,是新手入门和运维脚本场景的首选,安装指令基本一致,以pymysql为例:
pip3 install pymysql
装完后用python3 -c "import pymysql"验证是否成功,没有报错说明环境就绪,这一步卡住的人极多,大概率原因就是pip和pip3混用。
从连接到查询:python3连接mysql数据库步骤全解析
建立连接时参数细节直接决定成败
pymysql.connect()至少需要四个参数:host、port、user、password,外加一个database指定库名,举个实际例子:
import pymysql
conn = pymysql.connect(
host='192.168.1.100',
port=3306,
user='app_user',
password='YourPassword123',
database='order_system',
charset='utf8mb4'
)
连接超时和字符集这两项容易踩坑。charset不写utf8mb4,中文写入和查询大概率出现乱码,数据库服务器地址是云上RDS还是本地物理机,影响的是网络连通性问题云数据库通常需要把当前机器IP加入白名单,这一步经常被忽略。
游标操作的核心步骤与代码结构
连接对象创建后,任务是交给游标去执行的,游标(cursor)本质上是个句柄,负责发送SQL语句并接收结果集,标准代码结构如下:
cursor = conn.cursor()
sql = "SELECT id, username, created_at FROM users WHERE status = %s"
cursor.execute(sql, (1,))
rows = cursor.fetchall()
for row in rows:
print(row)
cursor.close()
conn.close()
参数占位符用%s而非直接拼接字符串,能有效防止SQL注入,执行INSERT、UPDATE、DELETE这类写操作后,必须调用conn.commit()提交事务,否则数据不会真正落库,这个细节被无数人问到过读操作不需要commit,写操作漏掉commit,数据库里看不到新数据。
数据库连接池:高并发场景下别裸连
每次查询都新建连接、用完关闭,在低流量脚本里没问题,一旦接口被频繁调用,TCP握手和MySQL认证的开销会拖慢响应,连接池的作用是复用已有连接,pymysql本身不带池化功能,但可以通过DBUtils库实现:
from dbutils.pooled_db import PooledDB
import pymysql
pool = PooledDB(
creator=pymysql,
maxconnections=10,
host='192.168.1.100',
port=3306,
user='app_user',
password='YourPassword123',
database='order_system'
)
conn = pool.connection()
连接池初始化时一次性创建多个连接,业务代码拿到的是池里的空闲连接,据行业观察,多数中小项目把连接池上限设在10到20之间足够应对日常流量,设置过高反而浪费数据库内存。
用ORM框架连接:sqlalchemy配置与使用
sqlalchemy的两种连接模式
直接写SQL适合查询逻辑简单的场景,但业务复杂后,维护字符串SQL的体验会越来越差,sqlalchemy作为Python生态里最出名的ORM框架,提供了两种使用方式:Core模式还是SQLAlchemy式声明式映射,本质上没有太大区别,connect()函数返回的engine对象承载了底层的连接池管理,连接字符串的格式至关重要:
from sqlalchemy import create_engine, text
engine = create_engine(
"mysql+pymysql://app_user:YourPassword123@192.168.1.100:3306/order_system?charset=utf8mb4"
)
with engine.connect() as conn:
result = conn.execute(text("SELECT FROM users LIMIT 10"))
for row in result:
print(row)
注意URL中的mysql+pymysql表示方言和驱动。postgresql+psycopg2对应PostgreSQL,mssql+pyodbc对应SQL Server,oracle+oracledb对应Oracle,写错了直接报错。
连接配置文件独立存放的实践建议
硬编码连接信息在代码里是个坏习惯,一旦密码轮换就面临全局搜索替换的麻烦,更合理的做法是把连接信息放进.env文件,用python-dotenv加载:
DB_HOST=192.168.1.100 DB_PORT=3306 DB_USER=app_user DB_PASSWORD=YourPassword123 DB_NAME=order_system
import os
from dotenv import load_dotenv
load_dotenv()
conn = pymysql.connect(
host=os.getenv("DB_HOST"),
port=int(os.getenv("DB_PORT")),
user=os.getenv("DB_USER"),
password=os.getenv("DB_PASSWORD"),
database=os.getenv("DB_NAME")
)
这样配置管理更安全,也是生产环境部署时的常规操作。
连接其他主流数据库的差异对比
| 数据库 | 驱动包 | 连接后端口确认 | 连接字符串要点 |
|---|---|---|---|
| MySQL | pymysql | 3306 | 注意charset参数 |
| PostgreSQL | psycopg2 | 5432 | 默认schema是public |
| SQL Server | pyodbc | 1433 | 需要额外配置ODBC Driver |
| Oracle | oracledb | 1521 | 需要填写service_name或SID |
python连接sql server数据库方法的实操说明
SQL Server的连接和个人开发环境的地域有关联,很多国内开发者使用的服务器部署在中国大陆机房,连接本地SQL Server时,pyodbc需要额外安装ODBC Driver,光pip装pyodbc还不够,Linux环境下通常要装msodbcsql17或msodbcsql18,官方文档提供了一整套命令行安装步骤,照着执行即可,连接串写法如下:
import pyodbc
conn = pyodbc.connect(
"DRIVER={ODBC Driver 17 for SQL Server};"
"SERVER=192.168.1.200,1433;"
"DATABASE=order_system;"
"UID=sa;"
"PWD=YourPassword123;"
)
端口号写在服务器地址后面用逗号分隔,这是SQL Server的习惯,和MySQL用冒号不一样。
常见连接报错的定位与排查思路
网络连通性导致的异常
Can't connect to MySQL server on '192.168.1.100'这类错误出现时,先别急着检查代码,用telnet 192.168.1.100 3306测试端口通不通,不通的话有三种可能:服务器防火墙没放行、云安全组策略未允许、目标IP确实不对,排查顺序全程应该是:先网络层,再认证层,最后代码层。
认证失败类错误
Access denied for user 'app_user'@'localhost'的意思是账号密码没错但来源主机受限,MySQL的权限是绑定host的,开发者在本机用的localhost账号没法在服务器上用,在数据库服务器上执行授权操作:
GRANT ALL PRIVILEGES ON order_system. TO 'app_user'@'%' IDENTIFIED BY 'YourPassword123'; FLUSH PRIVILEGES;
字符集报错梳理
中文插入数据库后显示问号,很大概率是建表时字符集没指定utf8mb4,或者连接字符集设置的编码和表结构不一致,优先在连接参数里加charset=’utf8mb4’,再检查建表语句的DEFAULT CHARSET,两者都修正就能解决问题。
python3连接数据库的安全细节不容忽视
密码管理
代码仓库里出现明文密码意味着所有拿到代码的人都能直连生产库,最常见的解决办法是环境变量,进阶做法是用密钥管理服务,比如AWS Secrets Manager或Vault,起码要做到避免把密码硬编码在Python源码中。
拒绝SQL拼接
用户输入直接拼进SQL字符串,攻击者在参数里注入恶意片段就能改写查询逻辑,pymysql的%s占位符、sqlalchemy的text()绑定参数,都能让SQL语句和数据完全分离,这是最基本的防线。
Q&A:python3连接数据库服务器常见问题解答
连接数据库时提示ModuleNotFoundError: No module named ‘pymysql’,怎么处理
确认安装命令是pip3而非pip,执行pip3 install pymysql后,再用python3进入交互式环境import一遍,如果依旧报错,用python3 -m pip install pymysql强制安装到当前解释器对应的路径下,这种情况多半是系统里存在多个Python版本,pip3装到了另一个解释器目录。
连接池最大连接数设置多少合适
连接池数上限建议基于数据库实例规格和业务调用量动态调整,多数情况下10到20足够支撑中小规模服务的日常请求,过大的设置值会导致数据库端线程数溢出,表现为连接等待时间逐步拉长,数据库CPU居高不下,合理的做法是从低限开始调高,配合监控曲线找到最佳值。
为什么连接数据库后查询很慢
影响查询慢的主要原因包不在连接环节SQL没有走索引、返回全表字段、网络延迟过大都有可能,先在数据库端执行EXPLAIN查看执行计划,确认索引命中情况和扫描行数,第二步检查是否在循环里反复关闭和创建连接,如果是,改为复用连接或改用连接池,这两步能把大量慢查询问题定位出七八成。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/727377.html


