1. 程式人生 > >sqlalchemy query函式可用引數有哪些?

sqlalchemy query函式可用引數有哪些?

一、模型名

二、模型物件屬性

三、聚合函式

名稱 作用
func.sum 求和
func.max 求最大值
func.min 求最小值
func.count 求行數
func.avg 求平均值

下面就分別為大家講講query函式這三種引數的用法。

在講之前,我已經把資料庫連線配置、模型,以及新增資料寫好了,程式碼如下:

from sqlalchemy import create_engine,Column,String,Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.session import sessionmaker
import random

DIALCT = "mysql"
DRIVER = "pymysql"
USERNAME = "root"
PASSWORD = "admin"
HOST = "127.0.0.1"
PORT = "3306"
DATABASE = "test"
DB_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALCT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()

class Student(Base):
    __tablename__ = "student"
    id = Column(Integer , primary_key=True , autoincrement=True)
    name = Column(String(50))
    score = Column(Integer)

    def __repr__(self):
        return "<Student name:%s,score:%s>"%(self.name,self.score)

Base.metadata.drop_all()
Base.metadata.create_all()

for i in range(6):
    # random.randint(0,100) 隨機生成一個0-100之間的成績
    student = Student(name = "name%s"%i,score=random.randint(0,100))
    session.add(student)
session.commit()

相信看過我文章的朋友,對於上面程式碼理解已經沒啥問題了!

第一種:模型名

語法:query(模型名)

假如我們現在要查詢表中所有學生資料,方法如下:

results = session.query(Student).all()
for result in results:
    print(result)

執行上述程式碼,然後就可以看到查詢結果了。

在前面我所講的關於sqlalchemy文章中,基本都是以該方式來查詢資料的。相信大家也都會了,沒啥好講的。

第二種:模型物件屬性

語法:query(模型名.模型屬性)

比如我們現在只想查看錶中所有學生的姓名(看到成績頭有點大),程式碼如下:

results = session.query(Student.name).all()
for result in results:
    print(result)

執行上述程式碼,我們就可以看到所有學生姓名了,結果如下:

第三種:聚合函式

上述表中我已列出所有所有的聚合函式,下馬我就一一為大家講講。注意:在使用聚合函式前,記得從sqlalchemy匯入

from sqlalchemy import create_engine,Column,String,Integer,func

1、func.sum

語法:query(func.sum(模型物件屬性))

比如想要知道所有學生成績之和,那麼我們就可以使用func.sum這個聚合函式來實現

results = session.query(func.sum(Student.score)).all()
print(results)

執行程式碼,結果學生成績之和就計算好了。

2、func.max

語法:query(func.max(模型物件屬性))

如果要查詢考試成績最高的哪個學生,就可以使用func.max這個函式

results = session.query(func.max(Student.score)).all()
print(results)

嗯,查詢出來的學生成績最高分是98分

3、func.min

語法:query(func.min(模型物件屬性))

我們知道最高分,然後想知道班上學生成績波動大小。哪怎麼辦呢??想知道成績波動大小,我們是不是還得知道班上成績最低分,是吧?然後用最大值減去最小值除以二就可以求出學生成績波動大小了。哪如何找出最小值呢?方法就是使用func.min這個聚合函式。

results = session.query(func.min(Student.score)).all()
print(results)

執行上述程式碼,我們就可以查詢到分數最低的哪個。

4、func.count

語法:query(func.count(模型物件屬性))

results = session.query(func.count(Student.score)).all()
print(results)

不出什麼意外的話,我們就能得到下面結果(沒錯吧,總共是6行):

5、func.avg

語法:query(func.avg(模型物件屬性))

期末考試考完,學校通常是不是要跟年級進行對比?對比啥?當然是班級考試成績排名、好壞啦!那麼如何對比呢?是不是通過考試成績平均分,是吧?我說的沒錯吧?OK,func.avg這個聚合函式就是為解決求平均值而生的。

results = session.query(func.avg(Student.score)).all()
print(results)

執行上述程式碼,結果如下:

平均分是58.3333,考的有點不太理想啊。

上面就是關於query函式可用引數講解。文章若有不當之處,歡迎大家指出!