使用 Python 代码连接 PostgreSQL

news2024/10/6 1:17:04

Python 是一个功能非常强大的编程语言,尤其在与数据库交互时,提供了丰富的解决方案。在实际项目中,我们经常需要通过 Python 连接并操作数据库。为了简化这种操作,ORM(对象关系映射)框架提供了便利。ORM 能够将数据库中的表映射为 Python 对象,从而使开发者可以用面向对象的方式操作数据,而不必直接编写 SQL 语句。

对于 Python 来说,最常用的 ORM 框架之一就是 SQLAlchemy。它功能强大,既支持高层次的 ORM 操作,也可以用作底层的 SQL 表达式语言。接下来,我们会详细说明如何使用 SQLAlchemy 这个框架,逐步拆解实现操作数据库的需求。

第一步:安装 SQLAlchemy

在开始编写代码之前,需要确保已经安装了 SQLAlchemy。你可以使用 pip 命令来安装这个库:

pip install sqlalchemy

这个命令会安装 SQLAlchemy 的核心模块。如果你的数据库是 MySQL、PostgreSQL 或 SQLite 等,还需要安装相应的驱动。例如,如果使用 SQLite,Python 标准库已经内置支持;而如果是 MySQL,可能需要安装 mysqlclientPyMySQL

pip install pymysql

第二步:配置数据库连接

SQLAlchemy 的连接部分很灵活,它既支持简单的数据库 URL 连接方式,也支持通过配置对象来连接。让我们来看一个连接 MySQL 数据库的例子:

from sqlalchemy import create_engine

# 创建数据库引擎,`echo=True` 表示输出生成的 SQL 语句,方便调试
engine = create_engine('mysql+pymysql://username:password@localhost:3306/mydatabase', echo=True)

在上面的代码中,create_engine 函数的参数是一个数据库 URL,它包含了数据库类型、驱动、用户名、密码、主机名和数据库名称。在这个例子里,我们使用 pymysql 作为 MySQL 的驱动,连接到名为 mydatabase 的数据库。

第三步:定义数据模型

在 SQLAlchemy 中,数据模型是通过 Python 类定义的,并与数据库中的表映射。为了定义一个表,通常继承 Base 类。让我们举一个例子,定义一个简单的用户表模型:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

# 创建基类
Base = declarative_base()

# 定义用户表模型
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    age = Column(Integer)

    def __repr__(self):
        return f"<User(name={self.name}, age={self.age})>"

在这个例子里,我们创建了一个名为 User 的类,并通过 __tablename__ 属性将它映射到数据库中的 users 表。每个字段对应数据库中的列,我们通过 Column 类定义字段的类型、主键约束等。

例如,id 是整数类型,并且是表的主键;name 是字符串类型,最大长度为 50;age 则是一个整数类型的字段。通过这种方式,你可以轻松地定义数据库中的表结构。

第四步:创建表

定义了数据模型后,下一步就是在数据库中创建相应的表。SQLAlchemy 提供了 Base.metadata.create_all 方法来自动根据模型创建表。

# 在数据库中创建表
Base.metadata.create_all(engine)

这个方法会检查模型中定义的所有表,并在数据库中创建它们。这一过程会自动生成对应的 SQL 语句,免去了手动编写 SQL 的麻烦。

第五步:插入数据

有了模型之后,可以开始插入数据。通过 SQLAlchemy,你只需要创建模型实例,然后将它们添加到数据库中。我们来看一个插入数据的例子:

from sqlalchemy.orm import sessionmaker

# 创建与数据库的会话
Session = sessionmaker(bind=engine)
session = Session()

# 创建一个用户实例
new_user = User(name='Alice', age=30)

# 将用户添加到会话
session.add(new_user)

# 提交会话,将数据保存到数据库
session.commit()

print(f"Inserted user with id: {new_user.id}")

在这里,我们使用了 sessionmaker 创建了一个与数据库的会话,并通过这个会话与数据库进行交互。session.add(new_user) 将新用户添加到会话中,而 session.commit() 则会提交事务,将更改保存到数据库中。

SQLAlchemy 会自动生成相应的 SQL 插入语句,插入数据到 users 表中。由于我们定义了 id 字段为主键,数据库会自动生成这个字段的值并返回。

第六步:查询数据

SQLAlchemy 提供了丰富的查询功能,允许你用 Python 表达式来构建 SQL 查询。例如,想要查询所有用户,可以使用如下代码:

# 查询所有用户
users = session.query(User).all()

for user in users:
    print(user)

这个查询使用了 session.query 方法,它会生成 SELECT * FROM users 的 SQL 语句,并返回所有用户。你可以像操作普通 Python 对象一样操作这些返回的结果。

除此之外,SQLAlchemy 还支持条件查询、排序、分页等功能。例如,如果你只想查找年龄大于 25 岁的用户,可以使用如下查询:

# 查询年龄大于 25 的用户
older_users = session.query(User).filter(User.age > 25).all()

for user in older_users:
    print(user)

第七步:更新数据

要更新数据库中的数据,可以先通过查询获取需要修改的对象,然后直接修改它的属性并提交会话。例如,如果想要更新用户 Alice 的年龄,可以这样做:

# 查找用户
user_to_update = session.query(User).filter_by(name='Alice').first()

# 更新年龄
if user_to_update:
    user_to_update.age = 31
    session.commit()

    print(f"Updated user {user_to_update.name}'s age to {user_to_update.age}")

在这个例子中,我们先使用 filter_by 方法查找了名为 Alice 的用户,然后直接修改了用户的 age 属性,并提交了更改。SQLAlchemy 会生成相应的 SQL UPDATE 语句,将更改同步到数据库。

第八步:删除数据

删除数据的过程与更新类似,先查询需要删除的对象,然后通过 session.delete 方法删除它,最后提交会话。例如:

# 查找用户
user_to_delete = session.query(User).filter_by(name='Alice').first()

# 删除用户
if user_to_delete:
    session.delete(user_to_delete)
    session.commit()

    print(f"Deleted user {user_to_delete.name}")

这段代码会删除名为 Alice 的用户。SQLAlchemy 会生成 DELETE FROM users WHERE name='Alice' 的 SQL 语句。

第九步:事务和回滚

在生产环境中,数据操作通常需要事务处理。SQLAlchemy 默认会将操作封装在事务中,调用 session.commit() 会提交事务。但在某些情况下,如果发生错误或你需要回滚操作,可以调用 session.rollback()

例如,假设在插入数据时发生了错误,可以使用如下代码进行回滚:

try:
    new_user = User(name='Bob', age=25)
    session.add(new_user)
    session.commit()
except Exception as e:
    session.rollback()
    print(f"Error occurred: {e}")

在这个例子里,如果 session.commit() 失败,事务将被回滚,确保数据库状态不会被破坏。

ORM 框架的优势

ORM 框架的一个关键优势是它使得数据库操作更加直观。通过对象的方式来操作数据库表和数据,开发者可以避免编写复杂的 SQL 语句。尤其在处理复杂的查询、表关联等情况下,ORM 框架通过简化操作和抽象化 SQL,大大提高了开发效率。

SQLAlchemy 还支持许多高级功能,如关系映射(多表关联)、复杂查询构建、缓存、异步查询等。这些特性使得它在大规模应用中也能得心应手。

举例:实际项目中的使用场景

在实际的应用开发中,SQLAlchemy 这样的 ORM 框架能极大简化操作数据库的复杂度。假设你在开发一个博客平台,你可以使用 SQLAlchemy 来定义和管理博客文章、用户评论、用户账户等多个表。通过 ORM,你可以轻松地实现用户的注册、登录、文章发布、评论管理等功能,而不必手动编写繁琐的 SQL 语句。

例如,假设你需要实现一个功能,用户可以发表博客文章,并且其他用户可以对文章进行评论。你可以通过 ORM 来定义 PostComment 两个表:

class Post(Base):
    __tablename__ = 'posts'
    
    id = Column(Integer, primary_key=True)
   

 title = Column(String(100), nullable=False)
    content = Column(String, nullable=False)
    author_id = Column(Integer, ForeignKey('users.id'))
    
class Comment(Base):
    __tablename__ = 'comments'
    
    id = Column(Integer, primary_key=True)
    content = Column(String, nullable=False)
    post_id = Column(Integer, ForeignKey('posts.id'))
    user_id = Column(Integer, ForeignKey('users.id'))

通过定义这些表结构,你可以轻松地管理文章和评论的关系,并且在程序中通过对象来操作这些数据。例如,创建一篇新文章或添加一个评论的操作,可以通过类似下面的代码来实现:

# 创建新文章
new_post = Post(title='My First Blog Post', content='This is the content of the post', author_id=1)
session.add(new_post)
session.commit()

# 添加评论
new_comment = Comment(content='Great post!', post_id=new_post.id, user_id=2)
session.add(new_comment)
session.commit()

通过这样的方式,SQLAlchemy 让你可以以一种更面向对象的方式处理复杂的数据库操作,大大提升了开发效率。

总结来看,SQLAlchemy 是 Python 生态中非常强大的 ORM 框架,它的功能覆盖了从简单的数据库操作到复杂的查询和事务管理。而且它的抽象层设计非常灵活,既能方便初学者使用,也能满足高级用户在复杂项目中的需求。

通过上面的步骤,你可以轻松地在 Python 中连接数据库,操作数据,并使用 ORM 模式简化开发流程。这种设计不仅让代码更加清晰,也提高了数据库操作的安全性和可靠性。

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

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

相关文章

aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图

aws(学习笔记第一课) 使用AWS CLI 学习内容&#xff1a; 使用AWS CLI配置密钥对创建ec2 server使用drawio&#xff08;vscode插件&#xff09;进行AWS的画图 1. 使用AWS CLI 注册AWS账号 AWS是通用的云计算平台&#xff0c;可以提供ec2&#xff0c;vpc&#xff0c;SNS以及clo…

灵足时代:具身智能核心部件的新秀崛起——解析数千万元天使轮融资

在智能科技日新月异的今天,具身智能作为连接物理世界与数字世界的重要桥梁,正逐步成为科技创新的前沿阵地。近日,具身智能核心部件领域的新锐公司——“灵足时代”宣布完成数千万元天使轮融资,这一消息无疑为行业内外带来了强烈的震撼与期待。本轮融资由雅瑞智友科学家基金…

多用户网页聊天室(测试报告)

一、项目背景 随着现代互联网的快速发展&#xff0c;实时通信系统&#xff08;如聊天应用&#xff09;已成为人们日常交流的重要工具。多用户网页聊天室项目旨在为用户提供一个基于Web的实时聊天平台&#xff0c;支持用户之间的即时通信、好友管理和历史消息记录查看。为了提升…

ModuleNotFoundError: No module named ‘package‘

报错&#xff1a; Traceback (most recent call last): File “”, line 198, in run_module_as_main File “”, line 88, in run_code File "D:\python\helloworld.venv\Scripts\pip.exe_main.py", line 4, in File "D:\python\helloworld.venv\Lib\site-pac…

3分钟学会下载 blender

1. blender简介 Blender是一款开源的3D创作套件&#xff0c;它由Blender Foundation维护&#xff0c;并得到了全球志愿者和专业开发者的支持。Blender广泛应用于3D模型的制作、动画、渲染、视频编辑、游戏创建、模拟、 composting以及3D打印等多个领域。 功能特点&#xff1a…

Gitlab flow工作流

Gitlab flow Gitlab flow 是 Git flow 与 Github flow 的综合。它吸取了两者的优点&#xff0c;既有适应不同开发环境的弹性&#xff0c;又有单一主分支的简单和便利。它是 Gitlab.com 推荐的做法。 1 上游优先 Gitlab flow 的最大原则叫做"上游优先"&#xff08;…

【网络篇】计算机网络——应用层详述(笔记)

目录 一、应用层协议原理 1. 进入应用层 2. 网络应用程序体系结构 &#xff08;1&#xff09;客户-服务器体系结构&#xff08;client-server architecture&#xff09; &#xff08;2&#xff09; P2P 体系结构&#xff08;P2P architecture&#xff09; 3. 进程间通讯 …

2024/10/5 数据结构打卡

对两个长度为n的升序序列A和B的元素按由小到大的顺序依次访问&#xff0c;这里访问的 含义只是比较序列中两个元素的大小&#xff0c;并不实现两个序列的合并&#xff0c;因此空间复杂度为 O(1)。按照 上述规则访问到第n个元素时&#xff0c;这个元素即为两个序列A和B的中位数。…

预扣预缴、年度汇算清缴与年终奖的个税计算

目录 1. 税率表2. 年度汇算清缴3. 预扣预缴3.1 预扣预缴的代码实现3.2 全年应纳税额与全年收入的关系 4. 年终奖 1. 税率表 月度税率表&#xff1a; 级数月度应纳税所得额税率&#xff08;%&#xff09;速算扣除数1 ( 0 , 3000 ] (0, 3000] (0,3000] 3 3 3 0 0 02 ( 3000 , 1…

Qt操作主/从视图及XML——实例:汽车管理系统

目录 1. 主界面布局2.连接数据库3.主/从视图应用 1. 主界面布局 先创建一个QMainwindow&#xff0c;不带设计界面 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QGroupBox> #include <QTableView> #include <QListWidg…

Python数据结构与算法问题详解

Python数据结构与算法问题详解 Python 作为一种高级编程语言&#xff0c;凭借其简洁的语法和强大的内置库&#xff0c;成为了数据结构与算法学习的绝佳工具。本文将深入解析几种常见的数据结构&#xff0c;并结合具体的算法&#xff0c;展示如何在实际问题中高效解决问题。通过…

EEPROM读写实验——FPGA学习笔记18

一、EEPROM简介 Electrically Erasable Progammable Read Only Memory:是指带电可擦可编程只读存储器&#xff0c;是一种常用的非易失性存储器&#xff08;掉电数据不丢失&#xff09; EEPROM发展历史 我们这次实验所用的AT24C64存储容量为64Kbit&#xff0c;内部分成256页&am…

PELT算法

PELT算法的范畴 PELT算法&#xff08;Pruned Exact Linear Time&#xff09;属于时间序列分析和变点检测&#xff08;Change Point Detection&#xff09;范畴的算法。 从更广泛的角度来看&#xff0c;PELT算法还可以归类为以下几类算法的子集&#xff1a; 1. 时间序列分析&…

SpringBoot在校园健康信息管理中的创新

第5章 系统详细设计 5.1管理员功能模块 管理员登录&#xff0c;通过填写注册时输入的用户名、密码、角色进行登录&#xff0c;如图5-1所示。 图5-1管理员登录界面图 管理员登录进入师生健康信息管理系统可以查看个人中心、学生管理、教师管理、数据收集管理、问卷分类管理、…

昇思学习打卡营学习记录:DCGAN生成漫画头像

DCGAN原理 DCGAN&#xff08;深度卷积对抗生成网络&#xff0c;Deep Convolutional Generative Adversarial Networks&#xff09;是GAN的直接扩展。不同之处在于&#xff0c;DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。 它最早由Radford等人在论文Unsupervised Re…

【STM32开发之寄存器版】(四)-独立看门狗IWDG

一 、前言 独立看门狗简介&#xff1a; STM32F103ZET6内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障。 独立看门狗主要性能&#xff1a; 自由运行的递减计数器时钟…

【C++11】C++11的新语法

文章目录 统一的列表初始化std::initializer_list 变量类型推导autodecltype STL中的一些变化 统一的列表初始化 在C98中&#xff0c;标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。 C11扩大了用大括号括起的列表(初始化列表)的使用范围&#xff0c;使其…

在 MySQL 中处理和优化大型报告查询经验分享

在 MySQL 数据库的使用过程中&#xff0c;我们经常会遇到需要生成大型报告的情况&#xff0c;这些查询可能涉及大量的数据和复杂的计算&#xff0c;对数据库的性能提出了很高的要求。 一、问题背景 大型报告查询通常具有以下特点&#xff1a; 数据量大&#xff1a;涉及大量的…

ConcurrentHashMap在JDK1.7和1.8的区别,详解

目录 1.了解HashMap底层插入原理 2.ConcurrentHashMap 是什么&#xff1f; HashTable的实现 3.ConcurrentHashMap 1.7和1.8的区别 4、JDK1.7 中的ConcurrentHashMap实现原理 6、JDK1.8中的ConcurrentHashMap 7.链表转红黑树条件 1.8 put方法 8.并发扩容 9.总结 首先呢…

Windows 11 24H2 v26100.1742 官方简体中文版

‌Windows 11 24H2是微软最新推出的操作系统更新&#xff0c;其在人工智能&#xff08;AI&#xff09;领域的创新为用户带来了显著的体验提升。该版本的一大亮点是AI Copilot&#xff0c;它能够智能地根据剪贴板内容调整操作上下文菜单&#xff0c;实现更智能化的交互。 此外&…