Python数据库编程全指南SQLite和MySQL实践

news/2024/6/15 15:48:45/文章来源:https://blog.csdn.net/kfashfasf/article/details/137140048

1. 安装必要的库

首先,我们需要安装Python的数据库驱动程序,以便与SQLite和MySQL进行交互。对于SQLite,Python自带了支持;而对于MySQL,我们需要安装额外的库,如mysql-connector-python

# 安装 MySQL 连接器
pip install mysql-connector-python

2. 连接SQLite数据库

SQLite是一种轻量级的嵌入式数据库,无需服务器即可使用。以下是如何连接并操作SQLite数据库的示例代码:

import sqlite3# 连接到 SQLite 数据库
conn = sqlite3.connect('example.db')# 创建一个游标对象
cursor = conn.cursor()# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')# 插入数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25))# 查询数据
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:print(row)# 提交并关闭连接
conn.commit()
conn.close()

3. 连接MySQL数据库

MySQL是一种常见的关系型数据库管理系统。使用Python连接MySQL需要使用相应的库,比如mysql-connector-python。以下是连接并操作MySQL数据库的示例代码:

import mysql.connector# 连接到 MySQL 数据库
conn = mysql.connector.connect(host="localhost",user="username",password="password",database="mydatabase"
)# 创建一个游标对象
cursor = conn.cursor()# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT)''')# 插入数据
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
val = ("Alice", 30)
cursor.execute(sql, val)# 查询数据
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:print(row)# 提交并关闭连接
conn.commit()
conn.close()

4. 代码解析

  • 连接数据库:使用sqlite3.connect()连接SQLite数据库,使用mysql.connector.connect()连接MySQL数据库。

  • 创建表:通过执行SQL语句创建表,使用cursor.execute()方法执行。

  • 插入数据:执行插入数据的SQL语句,使用cursor.execute()方法并传入参数。

  • 查询数据:执行查询数据的SQL语句,使用cursor.execute()方法,然后使用cursor.fetchall()获取所有查询结果。

  • 提交和关闭连接:对于SQLite,使用conn.commit()提交事务并使用conn.close()关闭连接。对于MySQL,同样使用conn.commit()提交事务,但需要使用conn.close()关闭连接。

通过这些示例代码,你可以轻松地使用Python连接和操作SQLite和MySQL数据库。务必记住在实际应用中,要处理好异常情况,并采取安全措施,如防止SQL注入等。

5. 数据库连接参数

在连接数据库时,需要提供一些参数以确保正确的连接。对于SQLite,只需提供数据库文件的路径即可。而对于MySQL,除了数据库名称外,还需要提供主机名、用户名和密码等信息。

  • 对于SQLite连接:

sqlite3.connect('example.db')

  • 对于MySQL连接:

conn = mysql.connector.connect(host="localhost",user="username",password="password",database="mydatabase"
)

6. 数据库操作的异常处理

在实际应用中,数据库操作可能会出现各种异常情况,比如连接失败、SQL语法错误等。因此,在进行数据库操作时,务必添加适当的异常处理机制,以提高程序的健壮性和稳定性。

以下是一个简单的异常处理示例:

import sqlite3
import mysql.connectortry:# SQLite 连接conn_sqlite = sqlite3.connect('example.db')cursor_sqlite = conn_sqlite.cursor()# MySQL 连接conn_mysql = mysql.connector.connect(host="localhost",user="username",password="password",database="mydatabase")cursor_mysql = conn_mysql.cursor()# 进行数据库操作(省略)except sqlite3.Error as e:print("SQLite error:", e)except mysql.connector.Error as e:print("MySQL error:", e)finally:# 关闭连接if conn_sqlite:conn_sqlite.close()if conn_mysql:conn_mysql.close()

7. 参数化查询

在执行SQL语句时,尤其是涉及用户输入的情况下,应该使用参数化查询来防止SQL注入攻击。参数化查询可以确保用户输入不会被误解为SQL代码的一部分。

下面是一个使用参数化查询的示例:

import sqlite3
import mysql.connector# SQLite 连接
conn_sqlite = sqlite3.connect('example.db')
cursor_sqlite = conn_sqlite.cursor()# MySQL 连接
conn_mysql = mysql.connector.connect(host="localhost",user="username",password="password",database="mydatabase"
)
cursor_mysql = conn_mysql.cursor()# 参数化查询
name = "Alice"
age = 30# SQLite 参数化查询
cursor_sqlite.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))# MySQL 参数化查询
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
val = (name, age)
cursor_mysql.execute(sql, val)# 提交事务并关闭连接
conn_sqlite.commit()
conn_sqlite.close()conn_mysql.commit()
conn_mysql.close()

8. ORM框架

ORM(Object-Relational Mapping)框架可以将数据库表的行映射为Python对象,简化了数据库操作。在Python中,有许多流行的ORM框架,比如SQLAlchemy、Django的ORM等。这些框架提供了高级的抽象和功能,使得与数据库的交互更加方便和直观。

以下是一个使用SQLAlchemy进行数据库操作的示例:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker# 创建引擎
engine = create_engine('sqlite:///example.db', echo=True)# 声明基类
Base = declarative_base()# 定义映射类
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 创建数据表
Base.metadata.create_all(engine)# 创建会话
Session = sessionmaker(bind=engine)
session = Session()# 插入数据
user1 = User(name='Alice', age=30)
user2 = User(name='Bob', age=25)
session.add(user1)
session.add(user2)
session.commit()# 查询数据
users = session.query(User).all()
for user in users:print(user.id, user.name, user.age)# 关闭会话
session.close()

9. 使用SQLite内存数据库

除了连接到文件中的SQLite数据库,还可以使用SQLite内存数据库。SQLite内存数据库完全存储在RAM中,对于临时性的数据处理或测试非常方便。

以下是一个使用SQLite内存数据库的示例:

import sqlite3# 连接到内存数据库
conn = sqlite3.connect(':memory:')# 创建一个游标对象
cursor = conn.cursor()# 创建表
cursor.execute('''CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')# 插入数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25))# 查询数据
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:print(row)# 提交并关闭连接
conn.commit()
conn.close()

10. 数据库连接池

在高并发的应用中,频繁地打开和关闭数据库连接会消耗大量资源。为了提高性能,可以使用数据库连接池技术,将数据库连接预先创建好并保存在池中,需要时从池中获取连接,使用完毕后归还到池中。

以下是使用sqlitepool库实现SQLite数据库连接池的示例:

from sqlitepool import ConnectionPool# 创建数据库连接池
pool = ConnectionPool('example.db', max_connections=5)# 从连接池中获取连接
conn = pool.getconn()# 创建游标对象
cursor = conn.cursor()# 执行查询
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:print(row)# 释放连接回连接池
pool.putconn(conn)

11. 性能优化

在进行大规模数据操作时,需要考虑性能优化。一些常见的性能优化策略包括:

  • 使用索引来加速查询。

  • 合理设计数据库结构,避免过度规范化或反规范化。

  • 批量操作数据,减少数据库交互次数。

  • 缓存查询结果,减少重复查询数据库的次数。

12. 使用异步数据库库

随着异步编程的流行,出现了许多支持异步操作的数据库库,如aiosqliteaiomysql。这些库可以与异步框架(如asyncio)结合使用,提高程序的并发性能。

以下是一个使用aiosqlite库进行异步SQLite数据库操作的示例:

import asyncio
import aiosqliteasync def main():# 连接到 SQLite 数据库async with aiosqlite.connect('example.db') as db:# 创建一个游标对象cursor = await db.cursor()# 创建表await cursor.execute('''CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')# 插入数据await cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))await cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25))# 查询数据await cursor.execute("SELECT * FROM users")rows = await cursor.fetchall()for row in rows:print(row)# 运行异步主程序
asyncio.run(main())

13. 数据库迁移

在实际项目中,随着需求的变化,可能需要对数据库结构进行修改,这时候就需要进行数据库迁移(Migration)。数据库迁移工具可以帮助我们管理数据库结构变更的过程,并确保数据的一致性。

对于SQLite,可以使用sqlite3自带的支持。对于MySQL等数据库,常用的迁移工具包括Alembicdjango.db.migrations等。

以下是一个简单的数据库迁移示例(以SQLite为例):

import sqlite3# 连接到 SQLite 数据库
conn = sqlite3.connect('example.db')
cursor = conn.cursor()# 执行迁移操作(修改表结构)
cursor.execute("ALTER TABLE users ADD COLUMN email TEXT")# 提交并关闭连接
conn.commit()
conn.close()

14. 备份与恢复

定期备份数据库是保障数据安全的重要措施之一。备份可以通过数据库管理工具或编程方式来实现,具体方法取决于数据库类型和需求。

以下是一个简单的备份数据库的示例(以SQLite为例):

import shutil# 备份数据库文件
shutil.copyfile('example.db', 'example_backup.db')

在实际应用中,备份数据库时需要考虑数据库是否处于活动状态、备份文件存储位置、备份周期等因素。

15. 使用环境变量管理数据库连接信息

在实际项目中,将数据库连接信息硬编码在代码中可能不够安全或不够灵活。一种更好的做法是使用环境变量来管理敏感信息,比如数据库的主机名、用户名和密码等。

以下是一个使用环境变量管理数据库连接信息的示例:

import os
import sqlite3
import mysql.connector# 从环境变量中获取数据库连接信息
DB_HOST = os.getenv('DB_HOST', 'localhost')
DB_USER = os.getenv('DB_USER', 'username')
DB_PASSWORD = os.getenv('DB_PASSWORD', 'password')
DB_NAME = os.getenv('DB_NAME', 'mydatabase')# SQLite 连接
conn_sqlite = sqlite3.connect('example.db')
cursor_sqlite = conn_sqlite.cursor()# MySQL 连接
conn_mysql = mysql.connector.connect(host=DB_HOST,user=DB_USER,password=DB_PASSWORD,database=DB_NAME
)
cursor_mysql = conn_mysql.cursor()# 进行数据库操作(省略)# 关闭连接
conn_sqlite.close()
conn_mysql.close()

通过使用环境变量,我们可以轻松地在不同的环境中切换数据库连接信息,而无需修改代码。

16. 使用配置文件管理数据库连接信息

除了使用环境变量,还可以使用配置文件来管理数据库连接信息。这种方法更加灵活,可以根据需要配置不同的环境,如开发环境、测试环境和生产环境等。

以下是一个使用配置文件管理数据库连接信息的示例:

import configparser
import sqlite3
import mysql.connector# 从配置文件中读取数据库连接信息
config = configparser.ConfigParser()
config.read('config.ini')DB_HOST = config.get('Database', 'host')
DB_USER = config.get('Database', 'user')
DB_PASSWORD = config.get('Database', 'password')
DB_NAME = config.get('Database', 'database')# SQLite 连接
conn_sqlite = sqlite3.connect('example.db')
cursor_sqlite = conn_sqlite.cursor()# MySQL 连接
conn_mysql = mysql.connector.connect(host=DB_HOST,user=DB_USER,password=DB_PASSWORD,database=DB_NAME
)
cursor_mysql = conn_mysql.cursor()# 进行数据库操作(省略)# 关闭连接
conn_sqlite.close()
conn_mysql.close()

通过配置文件的方式,我们可以将数据库连接信息集中管理,便于维护和修改。

17. 数据库连接的安全性考虑

在连接数据库时,需要考虑安全性问题,特别是涉及到密码和敏感信息的处理。一些常见的安全性措施包括:

  • 不要将敏感信息硬编码在代码中,而是使用环境变量或配置文件管理。

  • 使用加密技术保护敏感信息在传输过程中的安全性。

  • 使用强密码,并定期更换密码。

  • 限制数据库用户的权限,避免赋予过高的权限。

通过采取这些安全性措施,可以有效保护数据库连接信息和数据的安全。

总结

本文介绍了使用Python进行数据库连接与操作的多种方法和技术。首先,我们学习了如何使用Python连接和操作SQLite和MySQL数据库,包括创建表、插入数据、查询数据等基本操作。然后,我们探讨了一些高级技术,如参数化查询、ORM框架、异步数据库库、数据库迁移、备份与恢复等,这些技术可以提高数据库操作的效率和安全性。此外,我们还介绍了如何使用环境变量和配置文件来管理数据库连接信息,以及一些数据库连接的安全性考虑。通过这些技术和方法,我们可以更好地管理和保护数据库,使得数据库编程更加安全、灵活和高效。

在实际项目中,我们需要根据项目需求和安全标准选择合适的技术和工具,确保数据库连接和操作的安全性和可靠性。同时,我们也要不断学习和探索新的技术,以跟上数据库领域的发展和变化。希望本文能够帮助读者更好地理解和应用Python数据库编程的相关知识,为实际项目开发提供帮助和指导。

文章转载自:华为云开发者联盟

原文链接:https://www.cnblogs.com/huaweiyun/p/18101010

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AcWing刷题-游戏

游戏 DP l lambda: [int(x) for x in input().split()]n l()[0] w [0] while len(w) < n:w l()s [0] * (n 1) for i in range(1, n 1): s[i] s[i - 1] w[i]f [[0] * (n 1) for _ in range(n 1)]for i in range(1, n 1): f[i][i] w[i]for length in range(2, …

简介:商业BRD+市场MRD=产品PRD

前言 产品需求文档Product Requirements Document,PRD是将商业需求文档&#xff08;BRD&#xff09;和市场需求文档&#xff08;MRD&#xff09;用更加专业的语言进行描述。 产品经理对用户价值的体现&#xff0c;产品经理对商业价值的体现&#xff0c;能改变世界的产品经理&…

Quartz.Net详解(定时任务和调度)

http://t.csdnimg.cn/Jinaphttp://t.csdnimg.cn/Jinap

Centos服务器Open Gauss 部署

近期很多的项目由于信创要求使用一些国产的数据库&#xff0c;比如OpenGauss。OpenGuass是华为高斯DB的开源版&#xff0c;内核还是PostgreSQL&#xff0c;商业版是收费的。这里记录一下是如何安装部署 的。 官方中文文档 官方下载地址 部署要求 操作系统要求 ARM&#xff…

docker-compse安装es(包括IK分词器扩展)、kibana、libreoffice

Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。 Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等&#xff0c;直观的展示数据&#xff0c;从而达到高级的数据…

电梯四种事故检测YOLOV8

电梯四种事故检测&#xff0c;采用YOLOV8训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV调用&#xff0c;支持C/PYTHON/ANDORID开发 电梯四种事故检测YOLOV8

一个问题串联 Java 的几个基础知识

前言 关于 “” 和 equals() 的区别这个问题&#xff0c;我之前一直搞的很乱&#xff0c;虽然面试的时候一直没有被问到&#xff0c;但是我感觉这种是属于最基础的知识&#xff0c;如果不懂好像不是很好。后来我发现通过这个问题&#xff0c;可以串联起很多的知识点&#xff0…

Flutter仿Boss-2.启动页、引导页

简述 在移动应用开发中&#xff0c;启动页和引导页是用户初次接触应用时的重要组成部分&#xff0c;能够提升用户体验和导航用户了解应用功能。本文将介绍如何使用Flutter实现启动页和引导页&#xff0c;并展示相关代码实现。 启动页 启动页是应用的第一个页面&#xff0c;首…

Mac电脑Jmeter集成到Jenkins,压测多个接口并生成测试报告

Jenkins支持的JDK版本17、21&#xff0c;通过java -version查看当前JDK版本&#xff0c;确认是否匹配 打开网址https://www.jenkins.io/download 点击下载&#xff0c;选择mac版本 commend空格打开终端&#xff0c;输入安装命令brew install jenkins 安装完成后输入brew servi…

Github 2024-04-01 开源项目月报 Top20

根据Github Trendings的统计,本月(2024-04-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目9TypeScript项目2非开发语言项目2Jupyter Notebook项目2HTML项目1CSS项目1C#项目1Shell项目1Lua项目1JavaScript项目1C项目1Java项目…

【二叉树】Leetcode 437. 路径总和 III【中等】

路径总和 III 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节…

Qt加载.css/.qss文件设置控件的QSS样式(支持程序运行时修改且立即生效类似换肤效果)

初学Qt时&#xff0c;你是如何设置QWidget&#xff0c;QPushButton等原生基础控件的样式的&#xff1f;是不是主要是两种方法&#xff1f; 1.直接在可视化的.ui文件中直接添加qss语句。 2.在代码中通过setStyleSheet(QString qss)来设置qss语句。 上述两种方法&#xff0c;在程…

深度思考:雪花算法snowflake分布式id生成原理详解

雪花算法snowflake是一种优秀的分布式ID生成方案&#xff0c;其优点突出&#xff1a;它能生成全局唯一且递增的ID&#xff0c;确保了数据的一致性和准确性&#xff1b;同时&#xff0c;该算法灵活性强&#xff0c;可自定义各部分bit位&#xff0c;满足不同业务场景的需求&#…

ROS2从入门到精通1-2:详解ROS2服务通信机制与自定义服务

目录 0 专栏介绍1 服务通信模型2 服务模型实现(C)3 服务模型实现(Python)4 自定义服务5 话题、服务通信的异同 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。…

Linux基础命令篇:Linux文件权限与访问控制基础

Linux文件权限与访问控制基础 下面将详细介绍Linux文件权限管理&#xff0c;帮助有需要的ikun理解和应用这些概念。从基本的权限概念开始&#xff0c;然后介绍如何查看和修改权限。最后&#xff0c;我们整点高级的东西&#xff0c;如访问控制列表&#xff08;ACL&#xff09;。…

[Leetcode笔记] 动态规划相关

前言 写题目写到了一些和动态规划相关的内容&#xff0c;所以在这里记录一下 LCR 089 题解思路 总的来说&#xff0c;就是用一个数组去存储当前的最优解&#xff0c;然后从0开始一路向上顺推过去&#xff0c;求得最后一位的最优解。 class Solution { public:int rob(vect…

207基于matlab Simulink的无人机模型模拟飞机飞行过程

基于matlab Simulink的无人机模型模拟飞机飞行过程&#xff0c;具有GUI界面&#xff0c;可自行设置四旋翼飞行器结构参数&#xff0c;设有模拟仿真飞机动画。程序运行步骤&#xff1a;1&#xff0c;将Copy_4_of_quadrotorsflyerGU.mdlI文件拖入matlab命令窗口&#xff1b;2&…

算法——矩阵,被围绕的区域

. - 力扣&#xff08;LeetCode&#xff09; 最开始也是考虑使用dfs&#xff0c;对于矩阵中的每个点&#xff0c;如果能到达边界的O&#xff0c;则跳过继续dfs。否则如果上下左右四个方向都无法到达边界的O&#xff0c;则说明当前的无法到达&#xff0c;在一个set中记录他的行数…

1.5编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。

1、编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。 package com.kangning.web.controller.system;import java.util.Scanner;/*** 编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。*/ public class CountArea {public static void main(String[] args) …

【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!

操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…