AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Find、Take、First和Last函數(shù)的區(qū)別

來源: 責編: 時間:2023-10-19 09:28:06 292觀看
導讀大家好,我是漁夫子。在gorm中,要想從數(shù)據(jù)庫中查找數(shù)據(jù)有多種方法,可以通過Find、Take和First來查找。但它們之間又有一些不同。本文就詳細介紹下他們之間的不同。一、準備工作首先我們有一個m_tests表,其中id字段是自增的

大家好,我是漁夫子。xds28資訊網(wǎng)——每日最新資訊28at.com

在gorm中,要想從數(shù)據(jù)庫中查找數(shù)據(jù)有多種方法,可以通過Find、Take和First來查找。但它們之間又有一些不同。本文就詳細介紹下他們之間的不同。xds28資訊網(wǎng)——每日最新資訊28at.com

一、準備工作

首先我們有一個m_tests表,其中id字段是自增的主鍵,同時該表里有3條數(shù)據(jù)。如下:xds28資訊網(wǎng)——每日最新資訊28at.com

CREATE TABLE `m_tests` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '姓名',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;INSERT INTO test01.m_test (id,name) VALUES (1,'John'), (2,'Jack'),(3,'David');

基于這個表,我們來看看這幾個函數(shù)查詢出來的結(jié)果是什么。xds28資訊網(wǎng)——每日最新資訊28at.com

二、First函數(shù)

我們通過ToSql函數(shù)將First函數(shù)轉(zhuǎn)成對應(yīng)的sql語句來看。如下:xds28資訊網(wǎng)——每日最新資訊28at.com

func main() {	dsn := "username:password@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"	config := &gorm.Config{		NamingStrategy: schema.NamingStrategy{			SingularTable: true, // 禁用表名復數(shù)		}}	db, _ := gorm.Open(mysql.Open(dsn), config)	var row MTest	sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {		return tx.First(&row)	})	fmt.Printf("接收的sql語句:%s/n", sql)}

通過該程序,可以看到最終的sql語句如下:xds28資訊網(wǎng)——每日最新資訊28at.com

接收的sql語句:SELECT * FROM `m_test` ORDER BY `m_test`.`id` LIMIT 1

發(fā)現(xiàn)First函數(shù)是通過主鍵排序后,只獲取一條數(shù)據(jù)。我們在通過explain來解釋一下該條語句:xds28資訊網(wǎng)——每日最新資訊28at.com

explain SELECT * FROM `m_test` ORDER BY `m_test`.`id` LIMIT 1

其輸出結(jié)果如下:xds28資訊網(wǎng)——每日最新資訊28at.com

也就是說在查詢的時候也只掃描一行數(shù)據(jù)。也就是說First函數(shù)只掃描一行數(shù)據(jù)。xds28資訊網(wǎng)——每日最新資訊28at.com

三、Last函數(shù)

同樣,我們還是通過ToSQL來講Last函數(shù)轉(zhuǎn)化的sql語句打印出來:xds28資訊網(wǎng)——每日最新資訊28at.com

func main() {	dsn := "username:password@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"	config := &gorm.Config{		NamingStrategy: schema.NamingStrategy{			SingularTable: true, // 禁用表名復數(shù)		}}	db, _ := gorm.Open(mysql.Open(dsn), config)	var rows []MTest	sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {		return tx.Last(&rows)	})	fmt.Printf("接收的sql語句:%s/n", sql)  db.Last(&rows)  fmt.Printf("最終接收:%+v/n", rows)}

我們看到Last轉(zhuǎn)換成的sql語句如下:xds28資訊網(wǎng)——每日最新資訊28at.com

接收的sql語句:SELECT * FROM `m_test` ORDER BY `m_test`.`id` DESC LIMIT 1

所以,Take實際上是按主鍵倒序排列,并且只獲取1行數(shù)據(jù)的一個sql。xds28資訊網(wǎng)——每日最新資訊28at.com

我們再看最終獲取的結(jié)果rows,雖然是個數(shù)組,但也只有一行數(shù)據(jù)。:xds28資訊網(wǎng)——每日最新資訊28at.com

最終結(jié)果數(shù)據(jù):[{Id:6 Name:}]

所以,Last和First的相同點在于只掃描到表的一條目標數(shù)據(jù)后就截止了,并賦值給接收變量。不同點在于First是按主鍵正序排列,Last是按主鍵倒序排列。xds28資訊網(wǎng)——每日最新資訊28at.com

四、Take函數(shù)

再來看看Take函數(shù)的執(zhí)行過程。如下:xds28資訊網(wǎng)——每日最新資訊28at.com

func main() {	dsn := "username:password@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"	config := &gorm.Config{		NamingStrategy: schema.NamingStrategy{			SingularTable: true, // 禁用表名復數(shù)		}}	db, _ := gorm.Open(mysql.Open(dsn), config)	var row MTest	sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {		return tx.Take(&row)	})	fmt.Printf("接收的sql語句:%s/n", sql)}

Take函數(shù)執(zhí)行時最終轉(zhuǎn)換成的sql語句如下:xds28資訊網(wǎng)——每日最新資訊28at.com

SELECT * FROM `m_test` LIMIT 1

也是只獲取一行數(shù)據(jù),但和First不同的是缺少了Order BY m_test.id``。xds28資訊網(wǎng)——每日最新資訊28at.com

我們再通過explain來解釋下該條語句,如下, type列是ALL,rows列是3,因為我們表里只有3行數(shù)據(jù)。是全表掃描,然后再隨機獲取一行數(shù)據(jù)。如下:xds28資訊網(wǎng)——每日最新資訊28at.com

mysql> explain SELECT * FROM `m_test` LIMIT 1;+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+|  1 | SIMPLE      | m_test | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |   100.00 | NULL  |+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+1 row in set, 1 warning (0.09 sec)

所以,Take函數(shù)是掃描全表,并隨機獲取一條數(shù)據(jù)。所以,Take函數(shù)要比First函數(shù)性能差。xds28資訊網(wǎng)——每日最新資訊28at.com

同時,我們注意到,因為在sql語句中可以看到都有LIMIT 1的限制,所以Take和First都只能獲取一條數(shù)據(jù),即便是給傳遞了一個數(shù)組,也只能獲取一行數(shù)據(jù),不能獲取多行數(shù)據(jù)。xds28資訊網(wǎng)——每日最新資訊28at.com

五、Find函數(shù)

再來看看Take函數(shù)的執(zhí)行過程。我們首先給Find函數(shù)傳遞一個普通的非切片變量,如下:xds28資訊網(wǎng)——每日最新資訊28at.com

func main() {	dsn := "username:password@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"	config := &gorm.Config{		NamingStrategy: schema.NamingStrategy{			SingularTable: true, // 禁用表名復數(shù)		}}	db, _ := gorm.Open(mysql.Open(dsn), config)	var row MTest	sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB {		return tx.Find(&row)	})	fmt.Printf("接收的sql語句:%s/n", sql)}

轉(zhuǎn)換成的sql語句如下:xds28資訊網(wǎng)——每日最新資訊28at.com

接收的sql語句:SELECT * FROM `m_test`

和First和Take相比,缺少了Order子句和Limit子句。掃描的是整個表,獲取的也是表的所有數(shù)據(jù),但因為接收者是一個非切片變量,所以最終只接收了一行數(shù)據(jù)到row中。xds28資訊網(wǎng)——每日最新資訊28at.com

我們再來看看給Find傳遞一個切片變量來接收的情況:xds28資訊網(wǎng)——每日最新資訊28at.com

func main() {	dsn := "username:password@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"	config := &gorm.Config{		NamingStrategy: schema.NamingStrategy{			SingularTable: true, // 禁用表名復數(shù)		}}	db, _ := gorm.Open(mysql.Open(dsn), config)	var rows []MTest	tx.Find(&rows)	fmt.Printf("rows:%+v/n", rows)}

這個結(jié)果是接收所有查找到的行的數(shù)據(jù)到rows中。所以大家一定要注意,在使用Find查詢的時候一定要加Where條件和查詢的數(shù)量,以避免掃描和查詢?nèi)淼臄?shù)據(jù),尤其是在大數(shù)量的表中。xds28資訊網(wǎng)——每日最新資訊28at.com

六、總結(jié)

本文主要講解了First、Last、Take和Find查詢函數(shù)的不同之處。希望在使用過程中大家根據(jù)自己的應(yīng)用場景選擇合適的函數(shù)。xds28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-14122-0.htmlFind、Take、First和Last函數(shù)的區(qū)別

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 壓測工具界的 “悍馬” :wrk 使用

下一篇: Java中的代碼重構(gòu):技巧、優(yōu)秀實踐與方法

標簽:
  • 熱門焦點
  • 太卷!Redmi MAX 100英寸電視便宜了:12999元買Redmi史上最大屏

    8月5日消息,從小米商城了解到,Redmi MAX 100英寸巨屏電視日前迎來官方優(yōu)惠,到手價12999元,比發(fā)布價便宜了7000元,在大屏電視市場開卷。據(jù)了解,Redmi MAX 100
  • 8月總票房已突破10億!《封神》第一:口碑已經(jīng)成了

    8月5日消息,據(jù)燈塔專業(yè)版數(shù)據(jù),截至8月5日9時35分,8月總票房(含預(yù)售)已突破10億。其中,《封神》以大比分的優(yōu)勢領(lǐng)先。根據(jù)官方消息,目前該片總票房已經(jīng)超過14.
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 分享六款相見恨晚的PPT模版網(wǎng)站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網(wǎng)站旨在為全球Office用戶提供豐富的高品質(zhì)原創(chuàng)PPT模板、實用文檔、數(shù)據(jù)圖表及個性化定制服務(wù)。優(yōu)點:OfficePLUS是微軟官方網(wǎng)站,囊括PPT模板、Word模
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優(yōu)酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經(jīng)無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關(guān)心的“網(wǎng)紅”。7月5日至9日,為期5天的東方甄選“甘肅行”首次在自有App內(nèi)直播,
  • 三星折疊屏手機去年銷售近1000萬臺 今年目標定為1500萬

    7月29日消息,三星率先發(fā)力可折疊手機市場,在全球市場已經(jīng)取得了非常亮眼的成績,接下來會進一步鞏固和擴大這一優(yōu)勢。三星在推出Galaxy Z Flip5和Galax
  • 上海舉辦人工智能大會活動,建設(shè)人工智能新高地

    人工智能大會在上海浦江兩岸隆重拉開帷幕,人工智能新技術(shù)、新產(chǎn)品、新應(yīng)用、新理念集中亮相。8月30日晚,作為大會的特色活動之一的上海人工智能發(fā)展盛典人工
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主“七王”在群里介紹一些刷單賺
Top