详细介绍一下Python连接MySQL数据库的完整步骤

news2025/5/20 13:03:07

以下是 Python 连接 MySQL 数据库的完整步骤,包含环境准备、连接建立、数据操作、错误处理和性能优化等内容:
一、环境准备

  1. 安装 MySQL 服务器
    Windows/macOS:下载安装包 MySQL Installer
    Linux:
    bash

Ubuntu/Debian

sudo apt-get install mysql-server

CentOS/RHEL

sudo yum install mysql-server

  1. 启动 MySQL 服务
    bash

Linux/macOS

sudo service mysql start

Windows

net start mysql

  1. 创建测试数据库和用户
    sql
    – 登录MySQL
    mysql -u root -p

– 创建数据库
CREATE DATABASE testdb;

– 创建用户并授权
CREATE USER ‘testuser’@‘localhost’ IDENTIFIED BY ‘testpassword’;
GRANT ALL PRIVILEGES ON testdb.* TO ‘testuser’@‘localhost’;
FLUSH PRIVILEGES;
4. 安装 Python 驱动
bash
pip install mysql-connector-python
二、建立数据库连接

  1. 基本连接示例
    python
    import mysql.connector
    from mysql.connector import Error

try:
connection = mysql.connector.connect(
host=‘localhost’,
user=‘testuser’,
password=‘testpassword’,
database=‘testdb’,
port=3306 # 默认端口
)

if connection.is_connected():
    db_info = connection.get_server_info()
    print(f"连接成功,MySQL服务器版本: {db_info}")
    
    cursor = connection.cursor()
    cursor.execute("SELECT DATABASE();")
    database = cursor.fetchone()
    print(f"当前数据库: {database}")

except Error as e:
print(f"连接错误: {e}")

finally:
if connection.is_connected():
cursor.close()
connection.close()
print(“数据库连接已关闭”)
2. 连接参数详解
python
connection = mysql.connector.connect(
host=‘localhost’, # 主机地址
user=‘testuser’, # 用户名
password=‘testpassword’, # 密码
database=‘testdb’, # 数据库名
port=3306, # 端口号
charset=‘utf8mb4’, # 字符集
autocommit=True, # 自动提交事务
connection_timeout=10 # 连接超时时间(秒)
)
三、执行 SQL 操作

  1. 创建表
    python
    try:
    connection = mysql.connector.connect(…)
    cursor = connection.cursor()

    create_table_query = “”"
    CREATE TABLE IF NOT EXISTS employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    department VARCHAR(255) NOT NULL,
    salary DECIMAL(10, 2) NOT NULL,
    hire_date DATE NOT NULL
    )
    “”"

    cursor.execute(create_table_query)
    print(“表创建成功”)

except Error as e:
print(f"表创建失败: {e}")
2. 插入数据
python
try:
connection = mysql.connector.connect(…)
cursor = connection.cursor()

# 单条插入
insert_query = """
INSERT INTO employees (name, department, salary, hire_date)
VALUES (%s, %s, %s, %s)
"""
employee_data = ("John Doe", "IT", 5000.00, "2023-01-15")
cursor.execute(insert_query, employee_data)

# 批量插入
employees_data = [
    ("Jane Smith", "HR", 6000.00, "2023-02-20"),
    ("Robert Johnson", "Finance", 5500.00, "2023-03-10")
]
cursor.executemany(insert_query, employees_data)

connection.commit()  # 提交事务
print(f"插入成功,影响行数: {cursor.rowcount}")

except Error as e:
print(f"插入失败: {e}")
connection.rollback() # 回滚事务
3. 查询数据
python
try:
connection = mysql.connector.connect(…)
cursor = connection.cursor()

# 查询所有记录
select_query = "SELECT * FROM employees"
cursor.execute(select_query)
records = cursor.fetchall()
print(f"共查询到 {cursor.rowcount} 条记录")

for row in records:
    print(f"ID: {row[0]}, 姓名: {row[1]}, 部门: {row[2]}, 薪水: {row[3]}")

# 参数化查询
select_salary_query = "SELECT * FROM employees WHERE salary > %s"
cursor.execute(select_salary_query, (5000,))
high_salary_employees = cursor.fetchall()
print(f"高薪员工: {len(high_salary_employees)} 人")

except Error as e:
print(f"查询失败: {e}")
4. 更新数据
python
try:
connection = mysql.connector.connect(…)
cursor = connection.cursor()

update_query = "UPDATE employees SET salary = salary * 1.1 WHERE department = %s"
cursor.execute(update_query, ("IT",))
connection.commit()
print(f"更新成功,影响行数: {cursor.rowcount}")

except Error as e:
print(f"更新失败: {e}")
connection.rollback()
5. 删除数据
python
try:
connection = mysql.connector.connect(…)
cursor = connection.cursor()

delete_query = "DELETE FROM employees WHERE hire_date < %s"
cursor.execute(delete_query, ("2023-02-01",))
connection.commit()
print(f"删除成功,影响行数: {cursor.rowcount}")

except Error as e:
print(f"删除失败: {e}")
connection.rollback()
四、高级操作

  1. 使用字典游标
    python
    cursor = connection.cursor(dictionary=True)
    cursor.execute(“SELECT * FROM employees”)
    records = cursor.fetchall()

for row in records:
print(f"姓名: {row[‘name’]}, 部门: {row[‘department’]}")
2. 事务处理
python
try:
connection = mysql.connector.connect(…)
connection.autocommit = False # 关闭自动提交

cursor = connection.cursor()

# 执行多个操作
cursor.execute("INSERT INTO employees (...) VALUES (...)")
cursor.execute("UPDATE departments SET budget = budget - 10000")

connection.commit()  # 提交事务
print("事务执行成功")

except Error as e:
print(f"事务失败: {e}")
connection.rollback() # 回滚事务
3. 连接池
python
from mysql.connector import pooling

创建连接池

connection_pool = pooling.MySQLConnectionPool(
pool_name=“mypool”,
pool_size=5,
host=‘localhost’,
user=‘testuser’,
password=‘testpassword’,
database=‘testdb’
)

从连接池获取连接

connection = connection_pool.get_connection()
cursor = connection.cursor()
cursor.execute(“SELECT * FROM employees”)
五、错误处理与最佳实践

  1. 常见错误类型
    python
    try:
    connection = mysql.connector.connect(…)

    数据库操作

except mysql.connector.Error as e:
if e.errno == 1045: # 访问拒绝
print(“用户名或密码错误”)
elif e.errno == 1049: # 数据库不存在
print(“数据库不存在”)
elif e.errno == 2003: # 无法连接
print(“无法连接到MySQL服务器”)
else:
print(f"未知错误: {e}")
2. 资源管理
python

使用上下文管理器自动关闭连接和游标

with mysql.connector.connect(…) as connection:
with connection.cursor() as cursor:
cursor.execute(“SELECT * FROM employees”)
records = cursor.fetchall()
3. 性能优化
python

批量插入优化

data = [(f"User{i}", “Dept”, 5000) for i in range(1000)]
cursor.executemany(“INSERT INTO users VALUES (%s, %s, %s)”, data)

使用预编译语句

stmt = connection.prepare(“INSERT INTO users VALUES (?, ?, ?)”)
cursor.execute(stmt, (“User1”, “Dept”, 5000))
六、安全注意事项
避免 SQL 注入:
python

错误做法(不安全)

query = f"SELECT * FROM users WHERE name = ‘{name}’"

正确做法(使用参数化查询)

query = “SELECT * FROM users WHERE name = %s”
cursor.execute(query, (name,))

密码管理:
python

不要硬编码密码

推荐使用环境变量或配置文件

import os
password = os.environ.get(‘MYSQL_PASSWORD’)

权限最小化:
sql
– 为应用创建具有最小权限的用户
GRANT SELECT, INSERT, UPDATE ON testdb.* TO ‘appuser’@‘localhost’;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行人物移动(包括配置、代码详细实现过程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、InputSystem配置二、GameInput 游戏输入脚本1.实现思路2.完整代码三、Player 游戏人物移动脚本1.实现思路2.完整代码四、场景脚本设置1.组件设置五、问题解决1.人物一直下落2.人物跳跃时,…

单片机-STM32部分:13-1、编码器

飞书文档https://x509p6c8to.feishu.cn/wiki/BpEywhaX9iqbiLkdqdAcmDnwnab EC旋转编码器 在产品开发过程中&#xff0c;需要位置闭环的的产品&#xff0c;类似电机类产品来说&#xff0c;编码器至关重要&#xff0c;它不仅可以使我们对带年纪进行精确的速度闭环&#xff0c;位…

关于我在使用stream().toList()遇到的问题

关于我在使用stream().toList()遇到的问题 问题描述 在测试以上程序的时候抛出了空指针异常 于是我以为是我数据库中存在null字段&#xff0c;但查看后发现并不存在为null的数据 问题排查 起初我以为问题出现在sort排序方法这&#xff0c;事实也确实是&#xff0c;当我把s…

多卡跑ollama run deepseek-r1

# 设置环境变量并启动模型 export CUDA_VISIBLE_DEVICES0,1,2,3 export OLLAMA_SCHED_SPREAD1 # 启用多卡负载均衡 ollama run deepseek-r1:32b 若 deepseek-r1:32b 的显存需求未超过单卡容量&#xff08;如单卡 24GB&#xff09;&#xff0c;Ollama 不会自动启用多卡 在run…

基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例

前言 随着移动互联网的飞速发展&#xff0c;基于位置的服务&#xff08;LBS&#xff09;需求日益增长&#xff0c;越来越多的应用需要从地图中检索特定区域内的地理信息&#xff0c;例如商业场所、公共服务设施等。商场作为城市商业活动的重要载体&#xff0c;其周边的地理信息…

本地部署dify+ragflow+deepseek ,结合小模型实现故障预测,并结合本地知识库和大模型给出维修建议

1.准备工作 使用ollama 拉取deepseek-r1:7b 官网下载ollama ollama run deepseek-r1:7b ollama list Ragflow专注于构建基于检索增强生成&#xff08;RAG&#xff09;的工作流&#xff0c;强调模块化和轻量化&#xff0c;适合处理复杂文档格式和需要高精度检索的场景。Dify…

SECERN AI提出3D生成方法SVAD!单张图像合成超逼真3D Avatar!

SECERN AI提出的3D生成方法SVAD通过视频扩散生成合成训练数据&#xff0c;利用身份保留和图像恢复模块对其进行增强&#xff0c;并利用这些经过优化的数据来训练3DGS虚拟形象。SVAD在新的姿态和视角下保持身份一致性和精细细节方面优于现有最先进&#xff08;SOTA&#xff09;的…

【物联网】 ubantu20.04 搭建L2TP服务器

部署篇 序言 为了是两个客户端在同一个网络内&#xff0c;需要找一台服务器&#xff0c;搭建一个L2TP服务器&#xff0c;通过L2TP使两个客户端在同一个网络内,为什么要搭建&#xff0c;主要是解决例如员工出差后&#xff0c;还需要连接公司内网资源的问题&#xff0c;本文主要…

网络安全深度解析:21种常见网站漏洞及防御指南

一、高危漏洞TOP 10 1. SQL注入(SQLi) 原理:通过构造恶意SQL语句突破系统过滤机制 典型场景: - 联合查询注入: union select 1,version(),3--+ - 布尔盲注:and (select substr(user(),1,1)=r) - 时间盲注:;if(now()=sysdate(),sleep(5),0)/ 防御方案: - 严格参数化查…

从零启动 Elasticsearch

elastic 有弹力的 ElaticSearch &#xff08;ES&#xff09;是一个基于 Lucene 的分布式全文检索引擎。可以做到近乎实时地存储、检索数据&#xff0c;并且本身具有良好的扩展性&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别&#xff08;1 Petabyte 1024TB&…

Nginx基础知识

Nginx是什么&#xff1f; Nginx 是一款高性能的 Web 服务器、反向代理服务器和负载均衡器&#xff0c;以其高并发处理能力和低内存消耗著称。以下是 Nginx 的基础知识和常见配置示例&#xff1a; 1. 核心概念 • 配置文件位置&#xff1a;通常为 /etc/nginx/nginx.conf 或 /us…

Vue-监听属性

监听属性 简单监听 点击切换名字&#xff0c;来回变更Tom/Jerry&#xff0c;输出 你好&#xff0c;Tom/Jerry 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>监听属性</title><!-- …

python fastapi + react, 写一个图片 app

1. 起因&#xff0c; 目的: 上厕所的时候&#xff0c;想用手机查看电脑上的图片&#xff0c;但是又不想点击下载。此app 应运而生。 2. 先看效果 单击图片&#xff0c;能放大图片 3. 过程: 过程很枯燥。有时候&#xff0c; 有一堆新的想法。 但是做起来太麻烦&#xff0c;…

vscode c++编译onnxruntime cuda 出现的问题

问题描述 将onnx的dll文件和lib文件copy到可执行文件所在文件夹下后&#xff0c;现象&#xff1a; 双击可执行文件能正常运行 在vscode中点击cmake插件的运行按钮出现报错为 c [ONNXRuntimeError] : 1 : FAIL : LoadLibrary failed with error 126 “” when trying to load尝试…

中服云生产线自动化智能化调度生产系统:打造智能制造新标杆

前言 在当今制造业竞争日益激烈的背景下&#xff0c;实现生产线的自动化与智能化已成为企业提升竞争力的关键。作为国内技术领先的工业物联网平台、数字孪生、自动控制技术厂商&#xff0c;中服云凭借其深厚的技术积累和创新能力&#xff0c;打造了一套完整的生产线自动化智能…

云鼎入鼎系统:一站式电商管理解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务) &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1;个人微信&a…

Leetcode134加油站

题目链接 134 题意图解&#xff1a; 题目给了n个节点&#xff0c;这些节点呈现环状&#xff0c;每次到一个低点要消耗cost[i]的油量。 从中我们可以得出一个结论&#xff1a;看一个点能不能到下一个点&#xff0c;就要用当前的油量减去消耗的量&#xff0c;那么gas[i] - cost…

关于Android Studio for Platform的使用记录

文章目录 简单介绍如何使用配置导入aosp工程配置文件asfp-config.json 简单介绍 Android Studio for Platform是google最新开发&#xff0c;用来阅读aosp源码的工具 详细的资料介绍&#xff1a; https://developer.android.google.cn/studio/platform 将工具下载下来直接点击…

uniapp 微信小程序 获取openId

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“uniapp 微信小程序 获取openId”。 一、主要属性 1.uni.login 二、实例代码 1、前端代码 uni.login({provider: weixin,success: (res) > {uni.showLoading({title: 登录中...,mask: true})let code res.…

隧道结构安全在线监测系统解决方案

一、方案背景 隧道是地下隐蔽工程&#xff0c;会受到潜在、无法预知的地质因素影响。随着我国公路交通建设的发展&#xff0c;隧道占新建公路里程的比例越来越大。隧道属于线状工程&#xff0c;有的规模较大&#xff0c;可长达几公里或数十公里&#xff0c;往往穿越许多不同环境…