📜  sqlalchemy 按关系过滤 - SQL (1)

📅  最后修改于: 2023-12-03 15:20:17.984000             🧑  作者: Mango

sqlalchemy 按关系过滤 - SQL

sqlalchemy是Python中最常用的ORM库,它支持多种数据库系统,并提供了方便的查询语言。本文将介绍如何使用sqlalchemy按关系过滤查询数据库。

首先,需要了解关系数据库的基本概念。关系数据库中的数据通常被组织成表,每个表由一组列组成,每列对应一个字段。表之间可以建立关系,比如主键与外键关联。 sqlalchemy可以通过建立ORM映射,把逻辑上的对象映射到数据库中的表和字段。

建立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)

其中,userpassword是连接数据库需要使用的用户名和密码,host是数据库服务器的IP地址或域名,dbname是数据库名。 echo=True表示将所有的SQL语句输出到控制台,用于调试和测试。

创建会话(Session)

创建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提供了非常方便的查询语言,适用于各种关系数据库系统。