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技术站