📅  最后修改于: 2023-12-03 15:20:17.984000             🧑  作者: Mango
sqlalchemy
是Python中最常用的ORM库,它支持多种数据库系统,并提供了方便的查询语言。本文将介绍如何使用sqlalchemy
按关系过滤查询数据库。
首先,需要了解关系数据库的基本概念。关系数据库中的数据通常被组织成表,每个表由一组列组成,每列对应一个字段。表之间可以建立关系,比如主键与外键关联。 sqlalchemy
可以通过建立ORM映射,把逻辑上的对象映射到数据库中的表和字段。
建立ORM映射需要使用sqlalchemy.ext.declarative
模块中的declarative_base
类。例如,我们定义一个User
类,它映射到一个名为users
的表:
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)
age = Column(Integer)
这里我们使用了__tablename__
属性来指定表名,Column
实例表示一个列,Integer
表示整形, String
表示字符串类型。 id
列是主键列,因此我们使用primary_key=True
参数来指定。
使用sqlalchemy
连接数据库的方式非常灵活,我们这里以连接MySQL
为例。首先需要安装pymysql
模块,并在程序中引入create_engine
函数:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:password@host/dbname', echo=True)
其中,user
和password
是连接数据库需要使用的用户名和密码,host
是数据库服务器的IP地址或域名,dbname
是数据库名。 echo=True
表示将所有的SQL语句输出到控制台,用于调试和测试。
创建Session
对象之前,需要首先建立一个会话工厂,使用如下代码:
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
这里我们使用bind
参数来指定用于连接数据库的引擎对象。
建立映射和连接数据库之后,我们可以使用Session
对象执行查询操作。以下代码查询User
表中的所有记录:
session = Session()
users = session.query(User).all()
这里我们首先创建了一个Session
对象,然后使用query
函数来查询User
类型的所有记录。 all
函数表示返回所有记录的列表。
如果我们只想查询满足某个条件的记录,可以使用filter
函数进行过滤。以下代码查询名字为Tom
的记录:
user = session.query(User).filter(User.name == 'Tom').first()
这里我们使用filter
函数指定名字为Tom
的记录,并使用first
函数只返回第一条记录。
如果我们想要查询同时满足多个条件的记录,可以用and_
函数进行连接。以下代码查询名字为Tom
且年龄为18
的记录:
from sqlalchemy import and_
user = session.query(User).filter(and_(User.name == 'Tom', User.age == 18)).first()
这里我们使用and_
函数把两个条件连接起来。
如果我们想要对查询结果进行分组,可以使用group_by
函数。以下代码查询按照年龄分组的记录:
from sqlalchemy import func
result = session.query(User.age, func.count(User.id)).group_by(User.age).all()
这里我们使用func.count
函数来计算每个年龄有多少个记录。
如果我们想要按照某一列的值进行排序,可以使用order_by
函数。以下代码按照年龄升序排列:
users = session.query(User).order_by(User.age.asc()).all()
这里我们使用asc
函数表示升序排序,使用desc
函数表示降序排序。
如果我们想要在两个关联的表中进行查询,可以使用join
函数。以下代码查询用户及其对应的订单信息:
from sqlalchemy.orm import relationship
class Order(Base):
__tablename__ = 'orders'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
description = Column(String)
user = relationship(User)
orders = session.query(User, Order).join(Order).all()
这里我们定义了Order
类,包含了指向User
类的外键列user_id
。通过在relationship
装饰器中指定User
类,可以让Order
类自动关联到User
类。 join
函数表示连接两个表,我们使用all
函数查询所有记录。
本文介绍了如何使用sqlalchemy
按关系过滤查询关系数据库,包括建立ORM映射、连接数据库、创建会话、查询数据、过滤数据、分组查询、排序查询和多表查询等操作。sqlalchemy
提供了非常方便的查询语言,适用于各种关系数据库系统。