如何使用 Python 执行 SQL 查询?

一、常用的Python SQL库

在Python中执行SQL查询,最常用的库包括:

  1. sqlite3:用于与SQLite数据库交互,适合小型项目或测试环境。
  2. psycopg2:用于与PostgreSQL数据库交互,功能强大,支持复杂查询。
  3. mysql-connector-python 或 PyMySQL:用于与MySQL数据库交互。
  4. SQLAlchemy:一个ORM(对象关系映射)库,支持多种数据库,提供更高层次的抽象。
二、使用sqlite3执行SQL查询

sqlite3是Python内置的库,无需额外安装,适合快速开发和测试。

示例代码:

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 NOT NULL,age INTEGER)
''')# 插入数据
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))# 提交事务
conn.commit()# 查询数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()for row in rows:print(row)# 关闭连接
conn.close()

代码说明:

  1. 连接数据库:使用sqlite3.connect()连接到SQLite数据库。
  2. 创建游标:通过conn.cursor()创建游标对象,用于执行SQL语句。
  3. 执行SQL语句:使用cursor.execute()执行创建表、插入数据和查询数据的SQL语句。
  4. 提交事务:对于插入、更新等操作,需要调用conn.commit()提交事务。
  5. 获取结果:使用cursor.fetchall()获取查询结果。
  6. 关闭连接:操作完成后,调用conn.close()关闭数据库连接。
三、使用 psycopg2 执行 PostgreSQL 查询

psycopg2是Python中常用的PostgreSQL适配器,功能强大,支持异步操作和高级特性。

安装 psycopg2

pip install psycopg2-binary

示例代码:

import psycopg2
from psycopg2 import sql# 连接到PostgreSQL数据库
conn = psycopg2.connect(host='localhost',database='testdb',user='yourusername',password='yourpassword'
)# 创建游标
cursor = conn.cursor()# 创建表
create_table_query = '''
CREATE TABLE IF NOT EXISTS employees (id SERIAL PRIMARY KEY,name VARCHAR(100) NOT NULL,position VARCHAR(50),salary NUMERIC
);
'''
cursor.execute(create_table_query)# 插入数据
insert_query = sql.SQL("INSERT INTO employees (name, position, salary) VALUES (%s, %s, %s);")
cursor.execute(insert_query, ('Charlie', 'Developer', 70000))
cursor.execute(insert_query, ('Diana', 'Designer', 65000))# 提交事务
conn.commit()# 查询数据
cursor.execute('SELECT * FROM employees;')
rows = cursor.fetchall()for row in rows:print(row)# 关闭连接
cursor.close()
conn.close()

代码说明:

  1. 连接数据库:使用psycopg2.connect()连接到PostgreSQL数据库,需提供主机、数据库名、用户名和密码。
  2. 创建游标:通过conn.cursor()创建游标对象。
  3. 执行SQL语句:使用参数化查询(如%s)防止SQL注入。
  4. 提交事务:插入数据后,调用conn.commit()提交事务。
  5. 获取结果:使用cursor.fetchall()获取查询结果。
  6. 关闭连接:操作完成后,关闭游标和数据库连接。
四、最佳实践与注意事项
  1. 使用参数化查询防止SQL注入

    直接拼接SQL字符串容易导致SQL注入攻击。应使用参数化查询或预编译语句。

    # 不安全的做法(可能导致SQL注入)
    user_input = "Alice'; DROP TABLE users;--"
    cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")# 安全的做法
    cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
  2. 上下文管理器(with语句)管理连接和游标

    使用with语句可以确保连接和游标在使用完毕后自动关闭,避免资源泄漏。

    import sqlite3with sqlite3.connect('example.db') as conn:with conn.cursor() as cursor:cursor.execute('SELECT * FROM users')rows = cursor.fetchall()for row in rows:print(row)
  3. 处理事务

    对于需要保证数据一致性的操作,应显式管理事务,使用commit()rollback()

    try:with conn.cursor() as cursor:cursor.execute("BEGIN;")# 执行多个SQL操作cursor.execute("INSERT INTO table1 ...")cursor.execute("UPDATE table2 ...")conn.commit()
    except Exception as e:conn.rollback()print("事务回滚:", e)
  4. 使用ORM(如SQLAlchemy)简化数据库操作

    ORM提供了更高层次的抽象,可以减少手动编写SQL语句的需求,提高代码可维护性。

    安装SQLAlchemy:

    pip install SQLAlchemy

    示例代码:

    from sqlalchemy import create_engine, Column, Integer, String
    from sqlalchemy.orm import declarative_base, sessionmaker# 创建引擎
    engine = create_engine('sqlite:///example.db')# 定义基类
    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()# 添加数据
    new_user = User(name='Eve', age=28)
    session.add(new_user)
    session.commit()# 查询数据
    users = session.query(User).all()
    for user in users:print(user.id, user.name, user.age)# 关闭会话
    session.close()

    优点:

    • 提高代码的可读性和可维护性。
    • 自动处理连接和事务管理。
    • 支持复杂的查询和关系映射。
  5. 错误处理

    在数据库操作中,应捕获并处理可能的异常,确保程序的健壮性。

    try:cursor.execute("SELECT * FROM non_existent_table;")rows = cursor.fetchall()
    except sqlite3.OperationalError as e:print("表不存在:", e)
  6. 性能优化

    • 批量操作:对于大量数据的插入或更新,使用批量操作(如executemany)提高效率。
    • 索引:在频繁查询的字段上创建索引,加快查询速度。
    • 连接池:对于高并发应用,使用连接池管理数据库连接,避免频繁建立和关闭连接的开销。

    批量插入示例:

    data = [('Frank', 35), ('Grace', 29)]
    cursor.executemany('INSERT INTO users (name, age) VALUES (?, ?)', data)
    conn.commit()
五、实际开发中的建议
  1. 选择合适的库

    根据项目需求选择合适的数据库驱动或ORM。如果项目较小且使用SQLite,sqlite3足够;如果需要与PostgreSQL或MySQL交互,选择相应的适配器;对于复杂项目,考虑使用SQLAlchemy等ORM。

  2. 配置管理

    数据库连接信息(如主机、用户名、密码)应通过配置文件或环境变量管理,避免硬编码在代码中,提升安全性和灵活性。

  3. 日志记录

    记录数据库操作的日志,有助于调试和监控。可以使用Python的logging模块记录SQL语句和异常信息。

  4. 测试

    编写单元测试和集成测试,确保数据库操作的正确性。使用测试数据库进行测试,避免影响生产数据。

  5. 安全性

    除了使用参数化查询防止SQL注入,还应确保数据库用户权限最小化,定期更新数据库驱动和依赖库,防范潜在的安全漏洞。

使用Python执行SQL查询是后端开发中的基本技能。通过选择合适的库、遵循最佳实践、注意安全性和性能优化,可以高效地进行数据库交互。

同时,结合ORM等高级工具,可以进一步提升开发效率和代码质量。在实际开发中,务必重视错误处理、配置管理和安全性,确保系统的稳定和安全运行。

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

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

相关文章

stm32制作CAN适配器5--WinUsb上位机编写

上次我们要stm32制作了一个基于winusb有canfd适配器,今天我们来制作一个上位机程序来进行报文收发。 上位机还是用以前写好的,只是更改下dll文件。 项目链接器,输入,附加依赖项中增加winusb.lib winusb初始化:#incl…

数据库管理系统——数据库设计

摘要:本博客讲解了数据库管理系统中的数据库设计相关内容,包括概念结构设计:E-R模型,逻辑结构设计:E-R模型到关系设计等内容。 目录 一、数据库设计和数据模型 1.1.数据库设计概述 1. 2.数据库结构概述 1.3.数据库…

Pytorch | 从零构建AlexNet对CIFAR10进行分类

Pytorch | 从零构建AlexNet对CIFAR10进行分类 CIFAR10数据集AlexNet网络结构技术创新点性能表现影响和意义 AlexNet结构代码详解结构代码代码详解特征提取层 self.features分类部分self.classifier前向传播forward 训练过程和测试结果代码汇总alexnet.pytrain.pytest.py CIFAR1…

C++ 杨辉三角 - 力扣(LeetCode)

点击链接即可产看题目:118. 杨辉三角 - 力扣(LeetCode) 一、题目 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出…

【JetPack】WorkManager笔记

WorkManager简介: WorkManager 是 Android Jetpack 库中的一个重要组件。它用于处理那些需要在后台可靠执行的任务,这些任务可以是一次性的,也可以是周期性的,甚至是需要满足特定条件才执行的任务。例如,它可以用于在后…

GTID详解

概念和组成 1,全局事务表示:global transaction identifiers 2, GTID和事务一一对应,并且全局唯一 3,一个GTID在一个服务器上只执行一次 4,mysql 5.6.5开始支持 组成 GTID server_uuid:transaction_id 如&#xf…

常耀斌:深度学习和大模型原理与实战(深度好文)

目录 机器学习 深度学习 Transformer大模型架构 人工神经元网络 卷积神经网络 深度学习是革命性的技术成果,有利推动了计算机视觉、自然语言处理、语音识别、强化学习和统计建模的快速发展。 深度学习在计算机视觉领域上,发展突飞猛进,…

vsCode怎么使用vue指令快捷生成代码

1.下载Vetur插件 2.在文件-首选项-配置代码片段中找到vue.json文件 (注:旧版本的编辑器路径为文件-首选项-用户片段) 3.在打开的配置代码片段弹窗中搜索vue.json,找到并打开 (注:如果搜不到的话就按住鼠标…

python学opencv|读取图像(十八)使用cv2.line创造线段

【1】引言 前序已经完成了opencv基础知识的学习,我们已经掌握了处理视频和图像的基本操作。相关文章包括且不限于: python学opencv|读取图像(三)放大和缩小图像_python(1)使用opencv读取并显示图像;(2)使用opencv对图像进行缩放…

unity webgl部署到iis报错

Unable to parse Build/WebGLOut.framework.js.unityweb! The file is corrupt, or compression was misconfigured? (check Content-Encoding HTTP Response Header on web server) iis报错的 .unityweb application/octet-stream iis中添加 MIME类型 .data applicatio…

【深度学习】零基础介绍循环神经网络(RNN)

RNN介绍 零基础介绍语言处理技术基本介绍分词算法词法分析工具文本分类与聚类情感分析 自然语言处理词向量词向量学习模型1. 神经网络语言模型2. CBOW 和 skip-gram3. 层次化softmax方法4. 负采样方法 RNN介绍RNN的变种:LSTM1. Forget Gate2. Input Gate3. Update M…

Docker Compose 安装 Harbor

我使用的系统是rocky Linux 9 1. 准备环境 确保你的系统已经安装了以下工具: DockerDocker ComposeOpenSSL(用于生成证书)#如果不需要通过https连接的可以不设置 1.1 安装 Docker 如果尚未安装 Docker,可以参考以下命令安装&…

面试题整理9----谈谈对k8s的理解1

谈谈对k8s的理解 1. Kubernetes 概念 1.1 Kubernetes是什么 Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的…

【JAVA】JAVA接口公共返回体ResponseData封装

一、JAVA接口公共返回体ResponseData封装&#xff0c;使用泛型的经典 例子 public class ResponseData<T> implements Serializable { /** * */ private static final long serialVersionUID 7098362967623367826L; /** * 响应状态码 */ …

Redis分片集群学习总结

Redis分片集群学习总结 为什么要使用分片集群&#xff1f;分片集群搭建Redis集群怎么写入读取数据呢&#xff1f;集群写入数据和读取数据怎么定位到对应的节点呢&#xff1f;怎么让多个数据写入同一个节点&#xff1f; 故障转移主从集群和分片集群使用场景 为什么要使用分片集群…

代理模式(JDK,CGLIB动态代理,AOP切面编程)

代理模式是一种结构型设计模式&#xff0c;它通过一个代理对象作为中间层来控制对目标对象的访问&#xff0c;从而增强或扩展目标对象的功能&#xff0c;同时保持客户端对目标对象的使用方式一致。 代理模式在Java中的应用,例如 1.统一异常处理 2.Mybatis使用代理 3.Spring…

入侵他人电脑,实现远程控制(待补充)

待补充 在获取他人无线网网络密码后&#xff0c;进一步的操作是实现入侵他人电脑&#xff0c;这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址&#xff08;通过伪造的网页、伪造的Windows窗口、hook&#xff0c;信…

windows安装Elasticsearch及增删改查操作

1.首先去官网下载Elasticsearch 下载地址 我这里选择的是7.17.18 选择windows版本 下载完成后解压是这样的 下载完成后点击elasticsearch.bat启动elasticsearch服务 输入http://localhost:9200看到如下信息说明启动成功。 还有记得修改elasticsearch.yml文件&#xff0c;…

aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发

aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发 学习内容&#xff1a; 使用本地EC2中部署docker应用使用ECS的EC2模式进行容器开发使用ECS的Fargate模式进行容器开发 1. 使用本地EC2中部署docker应用 docker整体 这里展示了docker的整体流程。 开发阶段 编写dockerfile…

电脑使用CDR时弹出错误“计算机丢失mfc140u.dll”是什么原因?“计算机丢失mfc140u.dll”要怎么解决?

电脑使用CDR时弹出“计算机丢失mfc140u.dll”错误&#xff1a;原因与解决方案 在日常电脑使用中&#xff0c;我们时常会遇到各种系统报错和文件丢失问题。特别是当我们使用某些特定软件&#xff0c;如CorelDRAW&#xff08;简称CDR&#xff09;时&#xff0c;可能会遇到“计算…