使用Python进行数据库连接与操作SQLite和MySQL【第144篇—SQLite和MySQL】

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

使用Python进行数据库连接与操作:SQLite和MySQL

在现代应用程序开发中,与数据库进行交互是至关重要的一环。Python提供了强大的库来连接和操作各种类型的数据库,其中包括SQLite和MySQL。本文将介绍如何使用Python连接这两种数据库,并进行基本的操作,包括创建表、插入数据、查询数据等。

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数据库编程的相关知识,为实际项目开发提供帮助和指导。

在这里插入图片描述

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

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

相关文章

spring-boot-starter-thymeleaf加载外部html文件

在Spring MVC中,我们可以使用Thymeleaf模板引擎来实现加载外部HTML文件。 1.Thymeleaf介绍 Thymeleaf是一种现代化的服务器端Java模板引擎,用于构建漂亮、可维护且易于测试的动态Web应用程序。它适用于与Spring框架集成,并且可以与Spring M…

每日OJ题_牛客HJ12 字符串反转(IO型OJ)

目录 牛客HJ12 字符串反转 解析代码 牛客HJ12 字符串反转 字符串反转_牛客题霸_牛客网 解析代码 #include <iostream> using namespace std; int main() {string str "";cin >> str;int left 0, right str.size() - 1;while (left < right){ch…

Flink源码解析(1)TM启动

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

#每天一道面试题# 什么是MySQL的回表查询

MySQL中的索引按照物理存储的方式分为聚集索引和非聚集索引&#xff1b; 聚集索引索引和数据存储在一起&#xff0c;B树的叶子节点就是表数据&#xff0c;如果通过聚集索引查询数据&#xff0c;直接就可以查询出我们想要的数据&#xff1b;非聚集索引B树的叶子节点存储的是主键…

WebSocket 鉴权实践:从入门到精通

WebSocket 作为实时通信的利器&#xff0c;越来越受到开发者的青睐。然而&#xff0c;为了确保通信的安全性和合法性&#xff0c;鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制&#xff0c;为你呈现一揽子的解决方案&#xff0c;确保你的 WebSocket 通信得心应…

【C语言】【牛客】BC161 大吉大利,今晚吃鸡

文章目录 题目思路代码呈现 题目 链接: link 思路 这道题的本质其实不是考察C语言的运用&#xff0c;而是来考察我们对通项公式的总结。 我们可以看一下下面这道汉诺塔问题 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&…

【全网最详细】ComfyUI下,Insightface安装指南-聚梦小课堂

&#x1f96e;背景 ComfyUI下使用IP-adapter下的faceID模型的时候&#xff0c;大家可能会遇到如下错误&#xff1a; Error occurred when executing InsightFaceLoader: No module named insightface File "F:\ComfyUI-aki\execution.py", line 151, in recursive_…

凝思操作系统离线安装mysql和node

PS&#xff1a;下面这就是国产凝思的界面,测试版本是V6.0.80&#xff0c;第一次听说这种系统&#xff0c;于是去官网下载部署包&#xff0c;下面是地址 注意:这个系统如果没有激活&#xff0c;ip都不会有&#xff0c;这样文件都不能传到服务器&#xff0c;xshell这些工具都连不…

自托管状态页面工具Kener

什么是 Kener &#xff1f; Kener 是开源的 Node.js 状态页面工具&#xff0c;旨在轻松监控服务和处理事故。它提供了一个时尚且用户友好的界面&#xff0c;简化了对服务中断的跟踪&#xff0c;并改善了我们在事故期间的沟通方式。而最好的部分是&#xff0c;Kener 与 GitHub 无…

hosts文件丢失了怎么办?

hosts文件的位置&#xff1a;C:\Windows\System32\drivers\etc 丢失了恢复的方法&#xff1a; 在“管理员&#xff1a;命令提示符中输入&#xff1a; &#xff08;winR 然后cmd&#xff09; for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\d…

超实用!免费软件站大盘点,总有一款适合你

相信用Mac电脑的同学都知道一个网站MacWK&#xff0c;可以白嫖几乎所有常用软件&#xff0c;不用付费&#xff0c;但不好的消息是在2022年10月宣布关站&#xff0c;小编从此走上了开源免费的道路&#xff0c;尽管不太好用&#xff0c;奈何口袋木有钱&#xff0c;经过小编的不断…

AI大模型额外学习一:斯坦福AI西部世界小镇笔记(包括部署和源码分析)

文章目录 一、简单介绍1&#xff09;项目代码介绍2&#xff09;重新播放模拟3&#xff09;适当修改分叉模拟 二、部署斯坦福小镇Demo1&#xff09;准备工作2&#xff09;解决遇到的bug3&#xff09;启动服务器和前端 三、源码剖析1&#xff09;主题顺序 github链接 一、简单介…

08|记忆:通过Memory记住客户上次买花时的对话细节

无论是LLM还是代理都是无状态的&#xff0c;每次模型的调用都是独立于其他交互的。也就是说&#xff0c;我们每次通过API开始和大语言模型展开一次新的对话&#xff0c;它都不知道你其实昨天或者前天曾经和它聊过天了。 使用ConversationChain from langchain import OpenAI…

1.gradle编译和运行

1.在Windows 项目的根目录下使用.\gradlew.bat build命令进行编译。 如果出错的原因是连接超时&#xff1a; Exception in thread “main” java.io.IOException: Downloading from https://services.gradle.org/distributions/gradle-8.6-bin.zip failed: timeout (10000ms) a…

黑马程序员——javase进阶——day09——线程安全,死锁,状态,通讯,线程池

目录&#xff1a; 线程安全 线程安全产生的原因线程的同步同步代码块同步方法Lock锁线程死锁 概述:产生条件:代码实践线程的状态线程通信线程池 线程使用存在的问题线程池的介绍线程池使用的大致流程线程池的好处Java提供好的线程池线程池处理Runnable任务线程池处理Callable任…

LeetCode刷题记录:(11)组合(初识回溯算法)

leetcode传送通道 暂时记录&#xff0c;这篇没啥营养&#xff0c;不用看了 class Solution {List<List<Integer>> result new ArrayList<>(); // 存所有组合List<Integer> path new LinkedList<>(); //存每一个组合public List<List<Int…

世界第一个AI软件工程师问世!

2024年3月13日&#xff0c;科技公司Cognition推出了世界上第一位人工智能软件工程师Devin AI。这项创新有望利用人工智能编码和机器学习的力量加快发展。Devin AI不仅仅是帮助&#xff1b;它是一个成熟的队友&#xff0c;发挥智能编码自动化和自主人工智能编码的魔力&#xff0…

salesforce生产环境如何删除触发器

由于生产环境不能直接删除触发器&#xff0c;所以需要在sandbox中先让触发器inactive再部署到生产环境&#xff0c;就可以让触发器失效了。

苍穹外卖-day08:导入地址簿功能代码(单表crud)、用户下单(业务逻辑)、订单支付(业务逻辑,cpolar软件)

苍穹外卖-day08 课程内容 导入地址簿功能代码用户下单订单支付 功能实现&#xff1a;用户下单、订单支付 用户下单效果图&#xff1a; 订单支付效果图&#xff1a; 1. 导入地址簿功能代码&#xff08;单表crud&#xff09; 1.1 需求分析和设计 1.1.1 产品原型&#xff08…

苍穹外卖-day04:项目实战-套餐管理(新增套餐,分页查询套餐,删除套餐,修改套餐,起售停售套餐)业务类似于菜品模块

苍穹外卖-day04 课程内容 新增套餐套餐分页查询删除套餐修改套餐起售停售套餐 要求&#xff1a; 根据产品原型进行需求分析&#xff0c;分析出业务规则设计接口梳理表之间的关系&#xff08;分类表、菜品表、套餐表、口味表、套餐菜品关系表&#xff09;根据接口设计进行代…