filter过滤数据
在SQLAlchemy中,
filter
方法用于在查询中对数据进行过滤,以获取符合特定条件的记录。这方法允许你构建 SQL 查询中的
WHERE
子句,并可以组合多个条件来过滤数据。
方法及使用示例
以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现的:
使用
filter
方法来获取满足指定条件的记录。
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('mysql://user:password@localhost/dbname')
Session = sessionmaker(bind=engine)
session = Session()
# 查询用户名为'John'的用户
results = session.query(User).filter(User.name == 'John').all()
多个条件的过滤
可以组合多个条件来过滤数据,使用 and_
和 or_
来构建复杂的条件表达式。
from sqlalchemy import and_, or_
# 查询用户名为'John'且年龄大于等于30的用户
results = session.query(User).filter(and_(User.name == 'John', User.age >= 30)).all()
# 查询用户名为'John'或年龄大于等于30的用户
results = session.query(User).filter(or_(User.name == 'John', User.age >= 30)).all()
使用 like
方法进行模糊查询。
# 查询用户名以'J'开头的用户
results = session.query(User).filter(User.name.like('J%')).all()
使用 in_
方法来查询某个字段是否包含在一组值中。
values = ['John', 'Alice', 'Bob']
results = session.query(User).filter(User.name.in_(values)).all()
空值和非空值
使用 is_
方法来查询空值或非空值。
# 查询没有邮箱地址的用户
results = session.query(User).filter(User.email.is_(None)).all()
# 查询有邮箱地址的用户
results = session.query(User).filter(User.email.isnot(None)).all()
from random import randint
from uuid import uuid4
from sqlalchemy import Column,Integer,String,Float,Text,and_,or_
from db_util import Base,Session
class Article(Base):
__tablename__ = 't_article'
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False)
price = Column(Float,nullable=False)
content = Column(Text)
def __repr__(self):
return f"<Article(title:{self.title} price:{self.price} content:{self.content})>"
def create_data():
with Session() as ses:
for i in range(10):
if i%2 == 0:
art = Article(title = f'title{i+1}',price=randint(1,100),content = uuid4())
else:
art = Article(title = f'TITLE{i+1}',price=randint(1,100))
ses.add(art)
ses.commit()
def query_data():
with Session() as ses:
# rs = ses.query(Article).filter_by(id=1).first()
rs = ses.query(Article).filter(Article.id == 1).first()
print(rs)
def query_data_equal():
with Session() as ses:
rs = ses.query(Article).filter(Article.title == 'title2').first()
print(rs)
def query_data_not_equal():
with Session() as ses:
rs = ses.query(Article).filter(Article.title != 'title2').all()
print(rs)
def query_data_like():
with Session() as ses:
# select * from t_article where title like 'title%';
rs = ses.query(Article).filter(Article.title.like('title%')).all()
for r in rs:
print(r)
def query_data_in():
with Session() as ses:
rs = ses.query(Article).filter(Article.title.in_(['title1','title3','title6'])).all()
for r in rs:
print(r)
def query_data_not_in():
with Session() as ses:
rs = ses.query(Article).filter(~ Article.title.in_(['title1','title3','title6'])).all()
for r in rs:
print(r)
def query_data_null():
with Session() as ses:
rs = ses.query(Article).filter(Article.content == None).all()
for r in rs:
print(r)
def query_data_not_null():
with Session() as ses:
rs = ses.query(Article).filter(Article.content != None).all()
for r in rs:
print(r)
def query_data_and():
with Session() as ses:
# rs = ses.query(Article).filter(Article.title !='title4' and Article.price >8 ).all()
# rs = ses.query(Article).filter(Article.title !='title4',Article.price >50 ).all()
rs = ses.query(Article).filter(and_(Article.title !='title4',Article.price >50) ).all()
for r in rs:
print(r)
def query_data_or():
with Session() as ses:
rs = ses.query(Article).filter(or_(Article.title =='title4',Article.price >50) ).all()
for r in rs:
print(r)
if __name__ == '__main__':
# Base.metadata.create_all()
# create_data()
# query_data()
# query_data_equal()
# query_data_not_equal()
# query_data_like()
# query_data_in()
# query_data_not_in()
# query_data_null()
# query_data_not_null()
# query_data_and()
query_data_or()
-
Article 模型类定义:
- 你定义了一个名为
Article
的模型类,它映射到了数据库中的 t_article
表格,包括了 id
、title
、price
和 content
四个字段。
-
create_data 函数:
- 该函数在数据库中插入了一些示例数据,包括了标题、价格和内容。其中,标题的命名规则是
title{i+1}
或者 TITLE{i+1}
,价格是一个随机的整数,内容使用了 uuid4()
生成。
-
query_data 函数:
-
query_data_equal 函数:
- 该函数查询了标题等于
'title2'
的第一条记录。
-
query_data_not_equal 函数:
- 该函数查询了标题不等于
'title2'
的所有记录。
-
query_data_like 函数:
- 该函数查询了标题以
'title'
开头的所有记录。
-
query_data_in 函数:
- 该函数查询了标题在
['title1','title3','title6']
中的所有记录。
-
query_data_not_in 函数:
- 该函数查询了标题不在
['title1','title3','title6']
中的所有记录。
-
query_data_null 函数:
-
query_data_not_null 函数:
-
query_data_and 函数:
- 该函数查询了标题不等于
'title4'
且价格大于 50
的所有记录。
-
query_data_or 函数:
- 该函数查询了标题等于
'title4'
或者价格大于 50
的所有记录。
from flask import Flask, jsonify, json
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Float, func, and_, or_
from sqlalchemy.ext.declarative import dec...
最近项目中用了Sqlalchemy orm,开始数据不多的时候用coun()函数不会慢,但是当数据到百万级的时候,filter_obj.count()来获取数据总数,就明显感觉慢了。
看官方API的描述:
count()
Return a count of rows this Query would return.
This generates the SQL for this Q
# coding:utf-8
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine("mysql://user:password@ip/database?charset=utf8",
FILTER函数FILTER函数属于“筛选”类函数,隶属于“表”函数,其使用频率可以算得上最高的几个函数之一。用途:用来筛选表或者作为计算的筛选条件。语法DAX=
FILTER(<表>,<条件>)参数表:可以是固定的表,也可以是表的表达式。条件:过滤条件。返回结果由符合筛选条件的行组成的表。例子模拟数据:例子1:FILTER例子1 =
FILTER ( '例子', MONT...
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string Filter(string value)
数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要指定 搜索条件( search criteria ),搜索条件也称为过滤条件( filter condition )。
使用 WHERE 子句
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出,如下所示:
SELECT