python3连接数据库服务器有哪些方法?,连接池怎么配置?

核心结论先说清楚

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/python3%e8%bf%9e%e6%8e%a5%e6%95%b0%e6%8d%ae%e5%ba%93%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%9c%89%e5%93%aa%e4%ba%9b%e6%96%b9%e6%b3%95%ef%bc%9f%ef%bc%8c%e8%bf%9e%e6%8e%a5%e6%b1%a0%e6%80%8e%e4%b9%88%e9%85%8d/

赞 (0)
上一篇 2026年10月9日 11:17
下一篇 2026年10月9日 11:20

相关推荐

  • IP数量和带宽条款怎么审?,合同审查要点有哪些?

    审合同里的IP数量和带宽约定,核心答案就一条:IP地址归属权、带宽计量方式、违约赔偿标准这三处必须写清楚,只要这三处有任何一个模糊,合同上的“20个IP、100M带宽”就只能算营销话术,不叫服务承诺,为什么IP数量和带宽的合同约定最容易踩坑IP地址不是普通商品,服务商把IP“分配”给你,本质上是把一段公共资源的……

    程序编程 2026年10月21日
    100
  • 简米云服务器怎么通过IP直接访问网站?,有哪些方法

    要让阿里云服务器通过IP直接访问网站,必须同时满足三个条件:安全组放行对应端口、Web服务监听公网IP、没有强制跳转到域名, 这三步缺一不可,绝大多数“IP打不开”的故障都出在这里,阿里云服务器IP访问网站怎么设置:从零开始的实操流程很多新手买了阿里云服务器后,第一件事就是把自己的网页丢上去,结果浏览器输入公网……

    2026年9月28日
    100
  • ASP.NET如何动态添加控件?动态控件生成方法详解

    ASP.NET 动态生成控件:突破静态页面限制的核心技术ASP.NET 动态生成控件是指在运行时通过服务器端代码(C#或VB.NET)创建并操作控件对象,将其添加到页面控件树中呈现的技术,它突破了静态页面设计的局限,赋予开发者根据业务逻辑、用户输入或数据库内容实时构建复杂、灵活用户界面的能力,是构建数据驱动、高……

    2026年2月12日
    11330
  • 高频策略撤单频率如何匹配报文处理能力,什么是报文处理能力?

    高频策略的撤单频率与报文处理能力必须匹配,否则再好的策略逻辑也会在实盘中被延迟、丢单和交易所风控拦截拖垮,直接侵蚀收益,这两者的关系就像赛车引擎与变速箱——引擎转速再高,挡位挂不上,动力也传递不到地面,本文从量化实战角度拆解撤单频率与处理能力的匹配逻辑,先给结论,再分场景展开,撤单频率与报文处理能力的核心矛盾在……

    2026年9月8日
    200
  • 构建数据湖打折是真的吗,数据湖解决方案哪家强

    构建数据湖打折并非简单的价格谈判,而是通过架构优化、存储分层和采购策略组合,实现总体拥有成本(TCO)降低30%-50%的系统性工程,在2026年的数据治理语境下,企业不再单纯追求低价,而是追求“性价比最优”,数据湖作为企业数字资产的核心底座,其建设成本往往占据IT预算的半壁江山,许多决策者误以为“打折”就是找……

    2026年5月26日
    4100
  • 服务器租用独享IP到底有什么用,独享IP和共享IP哪个好?

    服务器租用里的独享IP,本质上是让整台服务器独占一个公网IPv4地址的所有请求和响应,不与其他网站或应用共享这条网络通道,它的核心价值在于帮你彻底摆脱共享IP带来的”连坐”风险,让业务在IP信誉、端口权限和访问控制上都拥有完全自主权,独享IP在服务器租用中解决了什么问题租用服务器时,服务商默认给你的往往是一个共……

    2026年10月20日
    200
  • AIoT全屋物联是什么?全屋智能系统如何搭建

    AIoT全屋物联并非简单的设备联网,而是通过统一协议与智能中枢,实现家居设备间的主动服务与场景联动,其核心价值在于提升居住舒适度、节能效率及安防可靠性,从单品智能到全屋智能的演进逻辑过去我们提到的智能家居,往往局限于单个APP控制一盏灯或一台空调,这种“孤岛式”体验存在明显的痛点:设备品牌不互通、操作繁琐、缺乏……

    2026年6月15日
    4000
  • 2b2t服务器手机版怎么下载,最新版安装包在哪找?

    2b2t服务器手机版怎么下载?2026年最新可用方法全解析2b2t服务器手机版无法直接下载安装包,你需要通过手机版Java启动器(如PojavLauncher)连接2b2t的Java版服务器地址,全程免费,但需注意设备性能和网络延迟问题,很多玩家在搜索“2b2t手机版下载”时,误以为存在一个独立的手机客户端,实……

    2026年9月27日
    000
  • 服务器linux维护怎么做?Linux服务器运维教程

    服务器Linux维护的核心在于建立一套预防性的、系统化的运维体系,而非仅仅是在故障发生后的被动修复,高效的维护策略能够确保系统持续稳定运行,最大化减少停机时间,并显著提升安全防御能力,通过系统监控、权限控制、定时备份及内核优化,可以构建一个高可用、高性能的Linux服务器环境,系统状态监控与性能基线建立维护工作……

    2026年3月28日
    10700
  • 我的世界服务器IP密码忘了怎么改,忘记密码如何找回?

    如果你的我的世界服务器IP密码忘了,最直接的办法是通过服务器控制台或配置文件重置密码,而不是去改IP——IP本身不需要密码,需要密码的是服务器后台或远程连接,很多玩家把“改服务器IP”和“忘记密码”混在一起,其实这是两件事,下面我按场景拆开讲,每一步都给你能直接照做的操作路径,搞清你忘的是哪个密码在动手之前,先……

    2026年8月11日
    1400

发表回复

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