SQLAlchemy orm query

本文介绍了使用SQLAlchemy ORM进行数据库查询的一些常见方法,包括限制返回字段和获取记录总数的查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLAlchemy的ORM是一个映射函数(Mapper),将Python中定义的 与数据库中的 建立关联,以及类的 实例(instance)和表的 行(row)建立关联  
查看一个类所对应的数据库表,使用__tablename__属性,例如 User.__tablename__

1. 查询数据 (query)

1.1 查询一个trace中flow个数(to count flows of specific trace)
session.query(Flow).filter(Flow.trace_id == 1) .count()

1.2. 查询一个trace中不同srcIP的个数 (to count distinct srcIP)
from sqlalchemy import distinct
from config import *
session = DBSession()
session.query( Flow.srcIP).filter(Flow.trace_id == 1). distinct(). count()

1.3 查询一个trace中不同的dstIP和dstPort对的个数(to count distinct dstIP and dstPort)
session.query( Flow.dstIP, Flow.dstPort).filter(Flow.trace_id == 1).distinct().count()

1.4 查询指定列的数据,返回一个KeyedTuple数据类型的列表( get a tuple list of specified columns )
n = session.query(Flow.dstIP, Flow.dstPort).filter(Flow.trace_id == 1) .all()
# The type of n is list.
# The type of n[0] is sqlalchemy.util._collections. KeyedTuple

1.5 查询指定列中的所有不同值( get a distinct tuple list of specified columns)
n = session.query(Flow.dstIP, Flow.dstPort).filter(Flow.trace_id == 1) .distinct().all()

1.6 获得一列数据的平均值(get average value of a column)
# sql language: select avg(txPkt) from Flow
from sqlalchemy.sql import func
q = session.query( func.avg(Flow.txPkt)).filter(Flow.trace_id == 1)
print q[0][0]
# The type of q is sqlalchemy.orm.query.Query
# The type of q[0] is sqlalchemy.util._collections.KeyedTuple
# The type of q[0][0] is decimal.Decimal

1.7 多列数据平均值的计算(compute average values of columns)
q = session.query((func.avg(Flow.txPkt) +func.avg(Flow.rxPkt)) /2).filter(Flow.trace_id == 1)

1.8 对查询到的数据排序(order by )
from sqlalchemy import desc
q = session.query(Flow.timestamp).filter(trace_id == 1). order_by(desc(Flow.timestamp))

1.9 分组查询
q = session.query(Flow.dstIP, Flow.dstPort, func.count(Flow.id)).filter(Flow.trace_id == tid). group_by(Flow.dstIP, Flow.dstPort).all()

2 查询中,常用的过滤操作
等于(equals), 例如 query.filter(name   == 'Jack')
不等于(not equals), 例如 query.filter(name  != 'Jack')
在列表中(in), 例如 query.filter(name. in_(['Micheal', 'Bob', 'Jack']))
不在列表中(not in), 例如 query.filter(~name.in_(['Micheal', 'Bob', 'Jack']))
空值(null), 例如 query.filter(name  == None)
不是空值(not null), 例如 query.filter(name  != None)
与(and), 例如 query.filter( and_(name == 'Andy', fullname == 'Andy Liu' ))
and_可以省略, 例如 query.filter(name=='Andy', fullname==‘Andy Liu')
或(or), 例如 query.filter( or_(name == 'Andy', name == 'Micheal'))


2. 表的数据操作(table data operation)
2.1 添加\删除一个column ( add a new column to a table)
from db import engine
from sqlalchemy import DDL
add_column =  DDL('alter table  Flow  add column cluster_id integer after trace_id')
drop_column =  DDL('alter table Flow  drop column microsecond')
engine. execute(add_column)
engine. execute(drop_column)

2.2 修改一个数据(update  a value)
session.query(Flow).filter(Flow.dstIP == dstIP, Flow.dstPort == dstPort, Flow.trace_id == 1). update({'cluster_id' : 0})

2.3 插入一行数据(insert a row)
      session = DBSession()
      cluster = Clusters(trace_id = tid, cluster_id = cid, \
                                   dstIP = dIP, dstPort = dPort, \
                                   avgPkt = aPkt, avgByte = aByte, \
                                   size = count)
      session. add(cluster)
      session.commit() # commit or flush
      session.close()

2.4  删除一行数据(delete a row )
      session = DBSession()
      session.query(Clusters).filter(Clusters.trace_id = 2).delete()
      session.commit() # commit or flush
      session.close()

补充:
外键 ForeignKey只能引用外表的指定列中已经存在的值。

几种常见sqlalchemy查询:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
     #简单查询
     print (session.query(User). all ())
     print (session.query(User.name, User.fullname). all ())
     print (session.query(User, User.name). all ())
     
     #带条件查询
     print (session.query(User).filter_by(name = 'user1' ). all ())
     print (session.query(User). filter (User.name  = =  "user" ). all ())
     print (session.query(User). filter (User.name.like( "user%" )). all ())
     
     #多条件查询
     print (session.query(User). filter (and_(User.name.like( "user%" ), User.fullname.like( "first%" ))). all ())
     print (session.query(User). filter (or_(User.name.like( "user%" ), User.password ! =  None )). all ())
     
     #sql过滤
     print (session.query(User). filter ( "id>:id" ).params( id = 1 ). all ())
     
     #关联查询 
     print (session.query(User, Address). filter (User. id  = =  Address.user_id). all ())
     print (session.query(User).join(User.addresses). all ())
     print (session.query(User).outerjoin(User.addresses). all ())
     
     #聚合查询
     print (session.query(User.name, func.count( '*' ).label( "user_count" )).group_by(User.name). all ())
     print (session.query(User.name, func. sum (User. id ).label( "user_id_sum" )).group_by(User.name). all ())
     
     #子查询
     stmt  =  session.query(Address.user_id, func.count( '*' ).label( "address_count" )).group_by(Address.user_id).subquery()
     print (session.query(User, stmt.c.address_count).outerjoin((stmt, User. id  = =  stmt.c.user_id)).order_by(User. id ). all ())
     
     #exists
     print (session.query(User). filter (exists().where(Address.user_id  = =  User. id )))
     print (session.query(User). filter (User.addresses. any ()))

限制返回字段查询

?
1
2
3
person  =  session.query(Person.name, Person.created_at,                     
              Person.updated_at).filter_by(name = "zhongwei" ).order_by(            
              Person.created_at).first()

记录总数查询:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from  sqlalchemy  import  func
 
# count User records, without
# using a subquery.
session.query(func.count(User. id ))
 
# return count of user "id" grouped
# by "name"
session.query(func.count(User. id )).\
         group_by(User.name)
 
from  sqlalchemy  import  distinct
 
# count distinct "name" values
session.query(func.count(distinct(User.name)))

每一个session表示一个事务,关闭session时:
首先预提交: session.flush()
然后提交: session.commit()
最后关闭: session.close()
SQLAlchemy是一款用Python语言编写的SQL工具包和ORM框架。ORM(Object-Relational Mapping)是一种编程技术,可以将数据库中的关系表映射到代码中的对象,从而实现对数据库的操作。SQLAlchemyORM框架可以将Python对象映射到关系数据库中的表格,并且可以使用Python语言来进行CRUD(增删改查)操作。 使用SQLAlchemy ORM框架可以让我们更加方便地进行数据库操作,同时也可以让我们的代码更加清晰易读。下面是一个使用SQLAlchemy ORM框架进行数据库操作的示例代码: ```python from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base # 创建数据库引擎 engine = create_engine('mysql+pymysql://username:password@host:port/database') # 创建ORM基类 Base = declarative_base() # 定义数据表对应的Python类 class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(50)) password = Column(String(50)) email = Column(String(50)) # 创建数据库会话 Session = sessionmaker(bind=engine) session = Session() # 增加数据 user = User(username='user1', password='123456', email='user1@example.com') session.add(user) session.commit() # 查询数据 users = session.query(User).all() for user in users: print(user.username) # 修改数据 user = session.query(User).filter(User.username=='user1').first() user.password = '654321' session.commit() # 删除数据 user = session.query(User).filter(User.username=='user1').first() session.delete(user) session.commit() ``` 上述代码演示了如何使用SQLAlchemy ORM框架进行增删改查操作。其中,通过创建ORM基类`Base`和定义数据表对应的Python类`User`,将数据库表映射到Python对象中。然后通过创建数据库会话`Session`,可以方便地进行数据库操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值