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实现查询IP地址所在地

    下面我来详细讲解一下“Python实现查询IP地址所在地”的完整攻略。主要分为以下几个步骤: 1. 确定数据来源 我们需要一个可以提供IP地址所在地数据的第三方数据源。常见的数据源有淘宝IP地址库、纯真IP地址库等。以淘宝IP地址库为例,在 https://ip.taobao.com/ 找到“API文档”,我们可以看到提供的查询API地址是: http://…

    Flask 2023年5月16日
    00
  • python优雅实现代码与敏感信息分离的方法

    当我们在编写Python代码时,常常需要使用一些敏感信息,例如数据库密码、API密钥等,这些信息是需要保密的,不能直接写在代码中。同时,我们也希望代码既能保证安全性,又要简洁优雅,不臃肿。本文将介绍一种优雅实现代码和敏感信息分离的方法,以及两个示例说明。 方法介绍 我们可以使用环境变量的方式来实现代码和敏感信息的分离。具体做法如下: 首先,在我们的Pytho…

    Flask 2023年5月16日
    00
  • Flask和Django框架中自定义模型类的表名、父类相关问题分析

    我将为您详细讲解“Flask和Django框架中自定义模型类的表名、父类相关问题分析”的完整攻略。 Flask框架中自定义模型类的表名 在Flask框架中,可以使用__tablename__来自定义模型类对应的表名。下面是一个示例: from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class…

    Flask 2023年5月16日
    00
  • Flask之请求钩子的实现

    Flask中有四个请求钩子,分别是before_first_request、before_request、after_request和teardown_request。这些钩子可以使得我们在请求处理的过程中,注入自己的代码逻辑,比如在请求之前或之后进行操作。 下面我们就逐个讲解这四个请求钩子的实现。 1. before_first_request befor…

    Flask 2023年5月15日
    00
  • Python的Flask项目中获取请求用户IP地址 addr问题

    Sure!获取请求用户的IP地址是一个常见的需求,在Flask项目中也是如此。下面我将会详细讲解如何在Flask项目中获取请求用户IP地址,包含两个示例说明,一步一步介绍如何实现。 方法一:从Flask请求对象中获取IP地址 在Flask项目中获取用户IP地址是非常简单的,你只需要从Flask请求对象中获取即可。以下是一个示例代码片段: from flask…

    Flask 2023年5月16日
    00
  • flask路由分模块管理及自定义restful响应格式详解

    让我来详细讲解一下 “flask路由分模块管理及自定义restful响应格式详解”。 分模块管理路由 对于复杂的 Flask 应用程序,通常需要将路由根据其功能进行分类和组织。这便是 Flask 蓝图的用处。蓝图可以让我们更好的组织视图函数及其关联的路由。 以下是 Flask 蓝图的使用方式: 导入 Blueprint 类 pythonfrom flask …

    Flask 2023年5月16日
    00
  • 将python项目打包成exe与安装包的全过程

    将 Python 项目打包成 exe 需要使用 pyinstaller 工具。pyinstaller 是一个非常常用的 Python 打包工具,可以将 Python 代码打包成可执行文件,支持 Windows、Linux 和 Mac OS 等多个平台。下面是将 Python 项目打包成 exe 的完整攻略: 安装 pyinstaller 在命令行中执行以下命…

    Flask 2023年5月16日
    00
  • Python from import导包ModuleNotFoundError No module named找不到模块问题解决

    当我们在Python代码中使用import导入模块时,有时会遇到ModuleNotFoundError或No module named找不到模块的问题。这个问题可能由于以下原因导致: 模块名称输入错误 模块没有安装 Python环境路径设定有误 以下是详细的解决步骤和示例说明: 1. 模块名称输入错误 在Python中导入模块时,输入模块名称非常重要,任何错…

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