Python ORM编程基础示例

Python ORM编程基础示例是指使用Python编程语言中的ORM(Object-Relational Mapping)技术来进行数据库操作的基础示例代码。下面分为两个示例,分别是基本的增删改查操作和多表操作。

示例一:基本的增删改查操作

1. 创建数据库表

首先需要创建一个数据库表,可以使用MySQL或SQLite等数据库,这里以SQLite为例。

创建一个student表,包含学生的id、name和age字段。在SQLite命令行中执行以下命令来创建该表:

CREATE TABLE student
(
 id   INTEGER PRIMARY KEY AUTOINCREMENT,
 name VARCHAR(20) NOT NULL,
 age  INTEGER
);

2. 安装ORM框架

接下来需要安装Python的ORM框架,这里以SQLAlchemy为例,使用以下命令进行安装:

pip install sqlalchemy

3. 连接数据库

在Python中使用SQLAlchemy连接SQLite数据库,代码如下:

from sqlalchemy import create_engine

engine = create_engine('sqlite:///test.db', echo=True)

其中,engine是SQLAlchemy的核心对象,用于连接数据库。这里使用了SQLite数据库,并将连接日志打开。

4. 定义ORM映射

ORM映射指将数据表和Python类进行映射,这里定义一个Student类来映射student表,代码如下:

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

Base = declarative_base()

class Student(Base):
    __tablename__ = 'student'

    id = Column(Integer, primary_key=True)
    name = Column(String(20), nullable=False)
    age = Column(Integer, default=0)

在这段代码中,首先引入了declarative_base()函数来创建一个SQLAlchemy的基类Base,然后定义了Student类,并使用__tablename__属性指定了对应的数据表名。最后,将id、name和age字段的属性定义为对应的Column对象,并指定一些基本属性,例如是否是主键、是否可以为空等等。

5. 创建表和删除表

现在定义好了ORM映射,接下来可以使用Base来创建表或删除表。

Base.metadata.create_all(engine)
Base.metadata.drop_all(engine)

其中,create_all方法将会根据ORM映射自动创建相关的数据表,而drop_all方法则会删除所有的数据表。

6. 插入数据

插入数据可以通过创建实例对象并调用session的add方法来实现:

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()

student1 = Student(name='张三', age=18)
student2 = Student(name='李四', age=20)

session.add(student1)
session.add(student2)
session.commit()

这里创建一个Session对象,它可以自动关联到engine中使用的database文件,并且支持事务。然后,创建两个Student实例对象,并使用session的add方法将其添加到session对象中。最后,调用commit方法提交事务。

7. 查询数据

查询数据可以使用session的query方法来实现:

students = session.query(Student).all()
for student in students:
    print(student.id, student.name, student.age)

这里查询了所有的student表数据,并将其以列表的形式返回。同时,可以使用for循环打印出每一个Student实例对象的id、name和age属性信息。

8. 修改数据和删除数据

修改数据和删除数据也非常简单,只需要先查询到要修改或删除的实例对象,然后再对属性进行修改或直接调用session的delete方法删除即可。

student = session.query(Student).filter_by(name='张三').first()
student.age = 20

session.delete(student)

session.commit()

这里先查询到了名字为“张三”的学生,并将其年龄改为了20岁,然后直接将其删除。最后再调用commit方法提交事务即可。

示例二:多表操作

前面的例子只操作了一个student表,现在考虑两个表之间的关联。

1. 创建数据库表和ORM映射

假设还有一个score表,它记录了学生的成绩信息。score表和student表之间有一对多的关系,即一个学生可能有多个成绩记录。在SQLite命令行中执行以下命令来创建该表:

CREATE TABLE score
(
 id       INTEGER PRIMARY KEY AUTOINCREMENT,
 student_id INTEGER NOT NULL,
 subject  VARCHAR(20) NOT NULL,
 score    INTEGER,
 FOREIGN KEY(student_id) REFERENCES student(id)
);

这里定义了一个score表,包含id、student_id、subject和score四个字段。其中,student_id字段是外键,引用了student表的id字段。

现在需要在Python中定义一个Score类来映射score表,代码如下:

class Score(Base):
    __tablename__ = 'score'

    id = Column(Integer, primary_key=True)
    student_id = Column(Integer, ForeignKey('student.id'), nullable=False)
    subject = Column(String(20), nullable=False)
    score = Column(Integer, default=0)

    student = relationship("Student", backref="scores")

在这个类中,定义了id、student_id、subject和score四个字段,其中,student_id使用ForeignKey引用了student表的id字段。另外,还定义了一个student属性,它使用relationship和backref属性来实现与Student类之间的关系。

2. 插入数据

首先需要插入一些学生的记录和成绩记录,代码如下:

student1 = Student(name='张三', age=18)
student2 = Student(name='李四', age=20)

score1 = Score(subject='语文', score=90)
score2 = Score(subject='数学', score=80)
score3 = Score(subject='英语', score=85)

student1.scores.append(score1)
student1.scores.append(score2)
student2.scores.append(score3)

session.add(student1)
session.add(student2)

session.commit()

这里创建了两个学生实例对象和三个成绩实例对象。然后,将score1和score2添加到student1的scores属性中,并将score3添加到student2的scores属性中。最后,将两个学生实例对象添加到session中并提交事务。

3. 查询数据

查询张三的所有成绩,代码如下:

scores = session.query(Score).join(Student).filter(Student.name == '张三').all()
for score in scores:
    print(score.subject, score.score)

这里首先使用join方法关联了student表,然后使用filter方法指定了要查询的学生名字为“张三”,最后调用all方法查询所有结果并遍历打印出每个成绩对象的subject和score属性。

查询每门课程的平均成绩,代码如下:

from sqlalchemy import func

avg_scores = session.query(Score.subject, func.avg(Score.score)).group_by(Score.subject).all()
for subject, avg_score in avg_scores:
    print(subject, avg_score)

这里使用了SQLAlchemy的函数func和group_by方法来查询每门课程的平均成绩。首先通过group_by方法将成绩对象按照科目进行分组,然后使用avg方法求出每组的平均值。最后使用all方法查询结果并遍历打印出每门课程的平均成绩。

4. 修改数据和删除数据

修改和删除数据的方法和示例一中类似,这里不再赘述。需要注意的是,修改或删除学生成绩时,需要先查询到对应的学生对象,然后再通过学生对象来修改或删除成绩。例如以下代码可以将李四的所有成绩删除:

student = session.query(Student).filter_by(name='李四').first()
scores = student.scores

for score in scores:
    session.delete(score)

session.commit()

这里首先查询到名字为“李四”的学生对象,然后获取其scores属性,遍历删除每个成绩对象。最后提交事务即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python ORM编程基础示例 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • python+flask编写一个简单的登录接口

    下面将为你详细讲解“Python+Flask编写一个简单的登录接口”的完整攻略以及两条示例说明。 一、准备工作 在开始编写登录接口前,需要进行以下准备工作: 1.安装Python和Flask,具体安装步骤可以参考官方文档。 2.安装Flask扩展flask_restful,可以使用以下命令进行安装: pip install flask_restful 二、编…

    Flask 2023年5月15日
    00
  • nodejs微信开发之接入指南

    下面是对于“nodejs微信开发之接入指南”的详细讲解,以及两条示例说明。 Node.js微信开发之接入指南 一、基础知识 1.申请微信公众号 首先,我们需要在微信公众平台上申请一个公众号。 2.配置开发者工具 登录微信公众平台后,在开发者中心中配置开发者工具。这里需要设置服务器配置和公众号设置。 3.节点服务器配置 在开发者工具中,需要设置一个节点服务器,…

    Flask 2023年5月16日
    00
  • Python的Flask框架中@app.route的用法教程

    下面是Python Flask框架中@app.route的用法教程攻略及示例说明。 什么是@app.route @app.route是一个装饰器,它用来注册一个网页的URL路径,每次当用户发送请求到该URL时,相应的函数就会被执行。这个装饰器通常用于Flask中的视图函数。 @app.route所装饰的函数将会作为视图函数,当访问被装饰的URL路径时,将触发…

    Flask 2023年5月15日
    00
  • Flask使用SQLAlchemy实现持久化数据

    当我们需要在Flask应用中使用关系型数据库,SQLAlchemy是一款功能强大,易于使用的Python ORM框架。在此,我将介绍如何在Flask应用中使用SQLAlchemy实现持久化数据。 步骤1:安装依赖 在开始前,我们需要安装依赖。在终端中执行以下命令安装依赖: pip install flask sqlalchemy 步骤2:创建Flask应用 …

    Flask 2023年5月16日
    00
  • Flask web开发处理POST请求实现(登录案例)

    对于“Flask web开发处理POST请求实现(登录案例)”的完整攻略,这里提供以下内容: 1. 准备工作 在开始实现登录功能前,需要安装Flask框架。 开发环境安装Flask的方式: pip install flask 2. 实现登录功能 2.1 创建登录页面 在开发过程中,首先需要创建一个登录页面。具体实现步骤如下: 在templates目录下创建l…

    Flask 2023年5月15日
    00
  • flask使用session保存登录状态及拦截未登录请求代码

    下面是“flask使用session保存登录状态及拦截未登录请求代码”的完整攻略,包含两条示例说明。 什么是Session Session 是指用户与Web应用间的一次会话,可以用来存储在整个会话过程中需要跨越请求和响应之间一直使用的数据。 在 Flask 中,可以使用 session 对象保存用户会话数据。session 对象是一个相当有用的、用于临时存储…

    Flask 2023年5月16日
    00
  • Python的Flask框架中配置多个子域名的方法讲解

    下面我就为您讲解Python的Flask框架中配置多个子域名的方法以及两个示例说明。 配置多个子域名的方法讲解 在Flask中配置多个子域名需要用到Flask中的蓝图(Blueprint)。蓝图是 Flask 中一个很重要的概念,它提供了一种组织 Flask 应用的方式,可以让开发者把应用分成一些比较小的部分。 具体步骤: 首先,我们需要在Flask应用中定…

    Flask 2023年5月16日
    00
  • Python常用Web框架Django、Flask与Tornado介绍

    Python常用Web框架Django、Flask与Tornado介绍 Web开发是现代互联网技术的重要组成部分,而Python作为一种易学易用的高级编程语言,逐渐成为了Web开发的主流语言之一。在Python的Web开发过程中,常常会使用到各种Web框架。本文将着重介绍Python常用的Web框架Django、Flask和Tornado,并且会提供两个示例…

    Flask 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部