放弃原生SQL:Python中更优雅的数据库操作

news2024/11/18 17:45:04


概要

在Python中,通过原生SQL语句进行数据库操作是一种传统的方式,但现代的Python开发中,使用ORM(Object-Relational Mapping)工具和数据库连接库可以更加高效和优雅地进行增删改查操作。本文将详细介绍Python中放弃原生SQL的理由,并演示使用ORM和数据库连接库的丰富示例代码,助你更好地理解和应用这些技术。


1. ORM的优势

ORM工具,提供了将数据库表映射为Python对象的功能。这种方式的优势在于:

1.1 面向对象

ORM允许开发者使用面向对象的方式来表示和操作数据库表,使得代码更加直观、易读、易维护。

# 使用SQLAlchemy定义一个User模型
from sqlalchemy import create_engine, Column, Integer, String, Sequence
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    age = Column(Integer)

1.2 避免SQL注入

ORM工具通常会使用参数化查询,避免了SQL注入的风险。

# 使用SQLAlchemy进行查询
user_id = 1
result = session.query(User).filter_by(id=user_id).first()

2. 使用SQLAlchemy进行数据库操作

2.1 增加数据

# 添加新用户
new_user = User(name='John Doe', age=30)
session.add(new_user)
session.commit()

2.2 查询数据

# 查询所有用户
users = session.query(User).all()
for user in users:
    print(f"ID: {user.id}, Name: {user.name}, Age: {user.age}")

2.3 更新数据

# 更新用户信息
user_to_update = session.query(User).filter_by(id=1).first()
user_to_update.age = 31
session.commit()

2.4 删除数据

# 删除用户
user_to_delete = session.query(User).filter_by(id=1).first()
session.delete(user_to_delete)
session.commit()

3. 使用数据库连接库进行操作

除了ORM,数据库连接库(如psycopg2mysql-connector-python等)也提供了直接执行SQL语句的方式。

import psycopg2

# 连接到PostgreSQL数据库
conn = psycopg2.connect(
    host="your_host",
    database="your_database",
    user="your_user",
    password="your_password"
)

# 创建游标对象
cursor = conn.cursor()

# 执行SQL查询
cursor.execute("SELECT * FROM users;")
records = cursor.fetchall()
for record in records:
    print(record)

# 关闭游标和连接
cursor.close()
conn.close()

4. 使用Django ORM进行数据库操作

对于Django开发者,Django ORM是一个强大而灵活的工具,与Django框架深度整合。以下是Django ORM的示例代码:

4.1 增加数据

# 定义一个模型
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

# 创建并保存新作者
new_author = Author(name='Jane Doe', age=25)
new_author.save()

4.2 查询数据

# 查询所有作者
authors = Author.objects.all()
for author in authors:
    print(f"ID: {author.id}, Name: {author.name}, Age: {author.age}")

4.3 更新数据

# 更新作者信息
author_to_update = Author.objects.get(id=1)
author_to_update.age = 26
author_to_update.save()

4.4 删除数据

# 删除作者
author_to_delete = Author.objects.get(id=1)
author_to_delete.delete()

选择适当的数据库操作方式

在实际项目中,选择使用ORM还是直接使用数据库连接库取决于多个因素。如果项目使用了Django框架,或者你更倾向于面向对象的编程方式,Django ORM是一个优秀的选择。对于其他项目,使用SQLAlchemy等独立的ORM工具或直接的数据库连接库也能提供灵活性和性能。

总体而言,选择更加符合项目需求的方式,有助于提高代码的可读性、可维护性和执行效率。在实际开发中,可以根据项目的规模、复杂性和团队的熟悉程度来综合考虑。希望本文提供的示例代码和讨论对你更好地理解和选择Python中数据库操作的方式有所帮助。

总结

本文详细介绍了在Python中放弃原生SQL的优势,并通过SQLAlchemy的ORM工具和数据库连接库展示了更为优雅和高效的数据库操作方式。使用ORM工具可以使代码更加面向对象,避免了SQL注入的风险,而数据库连接库则提供了更直接的SQL语句执行方式。在实际开发中,选择适合项目需求的方式,既可以保证代码的可读性和维护性,又能有效地进行数据库操作。

通过深入理解和实践这些数据库操作方式,更加游刃有余地处理各种数据库任务,提高开发效率。希望本文对你在Python中选择更合适的数据库操作方式有所启发。

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

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

相关文章

Ubuntu 18.04使用Qemu和GDB搭建运行内核的环境

安装busybox 参考博客: 使用GDBQEMU调试Linux内核环境搭建 一文教你如何使用GDBQemu调试Linux内核 ubuntu22.04搭建qemu环境测试内核 交叉编译busybox 编译busybox出现Library m is needed, can’t exclude it (yet)的解释 S3C2440 制作最新busybox文件系统 https:…

vue,nvue,uniapp,到底是什么

vue,nvue,uniapp,到底是什么? 发展猜想: 开发移动端软件,一般是控件逻辑,可拖动控件android studio都给你设计好了。 开发web页面时,用vue,vue是前端框架。主要是终端设备通过浏览器进行访问&#xff08…

第三节JavaScript 函数、作用域、事件、字符串、运算符、比较

一、JavaScript的作用域 1、变量在函数内声明,变量为局部变量,具有局部的作用域。 局部变量:只能在函数内部访问 示例: // 此处不能调用 carName 变量 function myFunction() { var carName "Volvo"; // 函数内可…

Unirest-Java:Java发起GET、POST、PUT、DELETE、文件上传,文件下载工具类介绍

一、简介 Unirest-Java是一个轻量级的HTTP客户端库,用于在Java应用程序中发送HTTP请求。 它提供了简单易用的API,可以方便地处理GET、POST、PUT、DELETE等HTTP方法。 Unirest-Java支持异步和同步请求,可以轻松地与JSON、XML等数据格式进行…

MongoDB的条件操作符

本文主要介绍MongoDB的条件操作符。 目录 MongoDB条件操作符1.比较操作符2.逻辑操作符3.元素操作符4.数组操作符5.文本搜索操作符 MongoDB条件操作符 MongoDB的条件操作符主要分为比较操作符、逻辑操作符、元素操作符、数组操作符、文本搜索操作符等几种类型。 以下是这些操作…

使用医学数据集MIMIC,常见的问题记录

目录 MIMIC数据库安装及数据导入教程1.postgresql安装第一步:error running考虑到是不是不同的sql的冲突从报错信息出发重启之后可以安装了 2.打开navicate153.7z 不是内部或外部命令,也不是可运行的程序4.在postgreSQL中输入**\i xxx**命令后遇到提示pe…

idea__SpringBoot微服务06——静态资源(新依赖),首页和图标定制

静态资源 一、静态资源二、首页和图标定制————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢谢~~ 新依赖&#xff1a;jquery的 <dependency><groupId>org.webjars&…

阿里云SLS采集jvm日志

一、背景 java应用部署在阿里云的k8s容器里&#xff0c;采集其日志的需求则是一个不可缺少的。而不同公司的jvm日志会存在很大的差异&#xff0c;所以本文仅以我的实际情况作一个示例&#xff0c;仅供有需要采集jvm日志的同学们一个参考。 我们打印的Jvm日志格式见下&#xf…

基于JAVA+SpringBoot+Vue的前后端分离的医院信息智能化HIS系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着科技的不断发展&a…

Gson 自动生成适配器插件

在json解析方面 我们常见有下面几方面困扰 1. moshi code-gen能自动生成适配器,序列化效率比gson快,但是自定义程度不如gson,能java kotlin共存 且解决了默认值的问题 2.gson api 强大自由,但是 第一次gson的反射缓存比较慢,而且生成对象都是反射,除非主动注册com.google.gson…

maven下载安装与配置

文章目录 1. Maven下载2. 配置settings.xml2.1 指定Maven的本地仓库2.2 配置阿里云提供的镜像仓库2.3 配置 Maven 工程的基础 JDK 版本 3. 配置环境变量3.1 检查 JAVA_HOME 配置是否正确3.2 配置 MAVEN_HOME3.3 配置PATH3.4 验证 1. Maven下载 【Maven官网地址】 【Maven下载…

消息队列zookeeper集群+kafka

消息队列zookeeper集群kafka kafka 3.0之前依赖于zookpeeper zookeeper开源分布式架构&#xff0c;提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式设计的分布式服务管理架构 存储和管理数据。分布式节点的服务结束观察者的注册&#xff0c;一旦分布式节点…

在idea中使用maven创建dynamic web project

1、先创建一个empty project 2、添加一个module , 核心是选择maven archetype webapp, 这个是maven提供的创建web工程的模版。 3、添加完等自动安装好即可 4、目录可能不完整 右键src---->点击New---->点击Directory &#xff08;注意&#xff1a;这是笔者所缺失的结…

汽车4S店中的“S”指的什么?柯桥生活英语学习

很多人买车都会去4S店选购 因为比较有保障 服务又很到位 可你有没有想过 这里的“4S”是什么意思 其实&#xff0c;这几个单词大家都认识 今天我们就来聊一下 与“4S店”相关的英文表达 01 “4S店”的英语表达 其实&#xff0c;4S店的全称是&#xff1a;汽车销售服务4S店…

20231207_最新已测_Centos7.4安装nginx1.24.0_安装详细步骤---Linux工作笔记066

以前安装的太模糊了,干脆重新写一个: 1.首先下载对应的nginx-1.24.0.tar.gz安装文件 2.然后: 去执行命令 安装依赖 yum install -y gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 3.然后:去解压 tar -zxvf ngi…

GO面试题系列

1.GO有哪些关键字 2.GO有哪些数据类型 3.Go方法与函数的区别 在Go语言中&#xff0c;方法和函数是两个不同的概念&#xff0c;尽管它们在某些方面有相似之处。下面是它们的主要区别&#xff1a; 定义位置&#xff1a; 函数&#xff1a; 函数是独立声明的&#xff0c;它们不…

vulnhub靶机Phineas

下载地址&#xff1a;https://download.vulnhub.com/phineas/Phineas.ova 主机发现 目标154 端口扫描 端口服务扫描 漏洞扫描 直接访问web 初始页面&#xff0c;我就不信没东西&#xff0c;开扫&#xff01; 访问一下 访问fuel时候发现url变化了 只能进行拼接url那就试一下凭借…

【C/C++笔试练习】多态的概念、虚函数的概念、虚表地址、派生类的虚函数、虚函数的访问、指针引用、动态多态、完全数计算、扑克牌大小

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;多态的概念&#xff08;2&#xff09;虚函数的概念&#xff08;3&#xff09;虚表地址&#xff08;4&#xff09;派生类的虚函数&#xff08;5&#xff09;虚函数的访问&#xff08;6&#xff09;分析程序&#xff08;7&…

树莓派CSI摄像头在新系统(23年12月)中的不用设置了,没有开关,也没有raspistill

网上都是老信息&#xff0c;用的raspistill命令&#xff0c;至少新系统没有这个东西了&#xff0c;也不会在sudo raspi-config里面也没有摄像头的开关了。 ls /dev/video* 能看到摄像头video0&#xff0c;但是vcgencmd get_camera supported0&#xff0c; detected0&#xff0…

IEEE期刊论文模板

一、模板下载 1、登陆IEEE作者中心Author Center 地址&#xff1a;Publish with IEEE Journals - IEEE Author Center Journals 2、点击“Download a template” 3、在弹出的模板下载页面点击IEEE模板选择器“IEEE Template Selector” 4、在弹出的模板选择器页面点击“Tran…