哪个公司的网站制作自己做网站卖阀门

当前位置: 首页 > news >正文

哪个公司的网站制作,自己做网站卖阀门,生成logo的网站,怎样在潇湘书院网站做兼职在gorm中#xff0c;要想从数据库中查找数据有多种方法#xff0c;可以通过Find、Take和First来查找。但它们之间又有一些不同。本文就详细介绍下他们之间的不同。 一、准备工作 首先我们有一个m_tests表#xff0c;其中id字段是自增的主键#xff0c;同时该表里有3条数据…在gorm中要想从数据库中查找数据有多种方法可以通过Find、Take和First来查找。但它们之间又有一些不同。本文就详细介绍下他们之间的不同。 一、准备工作 首先我们有一个m_tests表其中id字段是自增的主键同时该表里有3条数据。如下 CREATE TABLE m_tests (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL DEFAULT COMMENT 姓名,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8mb4;INSERT INTO test01.m_test (id,name) VALUES (1,John), (2,Jack),(3,David);基于这个表我们来看看这几个函数查询出来的结果是什么。 二、First函数 我们通过ToSql函数将First函数转成对应的sql语句来看。如下 func main() {dsn : username:passwordtcp(127.0.0.1:3306)/test01?charsetutf8mb4parseTimeTruelocLocaltimeout1000msconfig : gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true, // 禁用表名复数}}db, _ : gorm.Open(mysql.Open(dsn), config)var row MTestsql : db.ToSQL(func(tx *gorm.DB) *gorm.DB {return tx.First(row)})fmt.Printf(接收的sql语句:%s\n, sql) }通过该程序可以看到最终的sql语句如下 powershell复制代码接收的sql语句:SELECT * FROM m_test ORDER BY m_test.id LIMIT 1 发现First函数是通过主键排序后只获取一条数据。我们在通过explain来解释一下该条语句 powershell复制代码explain SELECT * FROM m_test ORDER BY m_test.id LIMIT 1 其输出结果如下 也就是说在查询的时候也只扫描一行数据。也就是说First函数只扫描一行数据。 三、Last函数 同样我们还是通过ToSQL来讲Last函数转化的sql语句打印出来 func main() {dsn : username:passwordtcp(127.0.0.1:3306)/test01?charsetutf8mb4parseTimeTruelocLocaltimeout1000msconfig : gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true, // 禁用表名复数}}db, _ : gorm.Open(mysql.Open(dsn), config)var rows []MTestsql : 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转换成的sql语句如下 powershell复制代码接收的sql语句:SELECT * FROM m_test ORDER BY m_test.id DESC LIMIT 1 所以Take实际上是按主键倒序排列并且只获取1行数据的一个sql。 我们再看最终获取的结果rows虽然是个数组但也只有一行数据。 powershell复制代码最终结果数据:[{Id:6 Name:}] 所以Last和First的相同点在于只扫描到表的一条目标数据后就截止了并赋值给接收变量。不同点在于First是按主键正序排列Last是按主键倒序排列。 四、Take函数 再来看看Take函数的执行过程。如下 func main() {dsn : username:passwordtcp(127.0.0.1:3306)/test01?charsetutf8mb4parseTimeTruelocLocaltimeout1000msconfig : gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true, // 禁用表名复数}}db, _ : gorm.Open(mysql.Open(dsn), config)var row MTestsql : db.ToSQL(func(tx *gorm.DB) *gorm.DB {return tx.Take(row)})fmt.Printf(接收的sql语句:%s\n, sql) }Take函数执行时最终转换成的sql语句如下 powershell复制代码SELECT * FROM m_test LIMIT 1 也是只获取一行数据但和First不同的是缺少了Order BY m_test.id。 我们再通过explain来解释下该条语句如下 type列是ALLrows列是3因为我们表里只有3行数据。是全表扫描然后再随机获取一行数据。如下

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函数是扫描全表并随机获取一条数据。所以Take函数要比First函数性能差。 同时我们注意到因为在sql语句中可以看到都有LIMIT 1的限制所以Take和First都只能获取一条数据即便是给传递了一个数组也只能获取一行数据不能获取多行数据。 五、Find函数 再来看看Take函数的执行过程。我们首先给Find函数传递一个普通的非切片变量如下 func main() {dsn : username:passwordtcp(127.0.0.1:3306)/test01?charsetutf8mb4parseTimeTruelocLocaltimeout1000msconfig : gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true, // 禁用表名复数}}db, _ : gorm.Open(mysql.Open(dsn), config)var row MTestsql : db.ToSQL(func(tx *gorm.DB) *gorm.DB {return tx.Find(row)})fmt.Printf(接收的sql语句:%s\n, sql) }转换成的sql语句如下 powershell复制代码接收的sql语句:SELECT * FROM m_test 和First和Take相比缺少了Order子句和Limit子句。扫描的是整个表获取的也是表的所有数据但因为接收者是一个非切片变量所以最终只接收了一行数据到row中。 我们再来看看给Find传递一个切片变量来接收的情况 func main() {dsn : username:passwordtcp(127.0.0.1:3306)/test01?charsetutf8mb4parseTimeTruelocLocaltimeout1000msconfig : gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true, // 禁用表名复数}}db, _ : gorm.Open(mysql.Open(dsn), config)var rows []MTesttx.Find(rows)fmt.Printf(rows:%v\n, rows) }这个结果是接收所有查找到的行的数据到rows中。所以大家一定要注意在使用Find查询的时候一定要加Where条件和查询的数量以避免扫描和查询全表的数据尤其是在大数量的表中。 六、总结 本文主要讲解了First、Last、Take和Find查询函数的不同之处。希望在使用过程中大家根据自己的应用场景选择合适的函数。