偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

心態(tài)崩了!這個(gè)問(wèn)題,困擾了我兩個(gè)小時(shí)

開發(fā)
數(shù)據(jù)庫(kù)設(shè)計(jì)中的每一個(gè)細(xì)節(jié)都可能對(duì)功能產(chǎn)生重大影響,主鍵的設(shè)置看似簡(jiǎn)單,但如果用錯(cuò)了地方,就會(huì)引發(fā)意想不到的問(wèn)題。

一次因?yàn)橹麈I設(shè)置引發(fā)的“數(shù)據(jù)之謎”

最近在開發(fā)一個(gè)聊天功能時(shí),我遇到了一個(gè)奇怪的問(wèn)題:明明數(shù)據(jù)庫(kù)里有9條符合條件的記錄,但查詢出來(lái)的結(jié)果卻只有1條。

問(wèn)題的出現(xiàn)

事情是這樣的:我在開發(fā)一個(gè)聊天功能,用戶之間的對(duì)話記錄需要存儲(chǔ)在數(shù)據(jù)庫(kù)中。為了方便查詢某個(gè)用戶的對(duì)話記錄,我在ConversationModel表中使用了user_id字段來(lái)標(biāo)識(shí)用戶。代碼邏輯很簡(jiǎn)單:先查詢某個(gè)用戶的對(duì)話記錄總數(shù),然后再獲取具體的對(duì)話內(nèi)容。

count = ConversationModel.query.filter_by(user_id=recipient_uid).count()
print(f"符合條件的記錄總數(shù):{count}")

conversation_messages = ConversationModel.query.filter_by(user_id=recipient_uid).all()
print(f"查詢到的記錄數(shù):{len(conversation_messages)}")

運(yùn)行代碼后,我發(fā)現(xiàn)count的值是9,但conversation_messages的長(zhǎng)度卻是1。這讓我非常困惑:明明數(shù)據(jù)庫(kù)里有9條記錄,為什么查詢出來(lái)的結(jié)果只有1條呢?

排查過(guò)程

一開始,我以為是查詢條件寫錯(cuò)了,反復(fù)檢查了代碼,確認(rèn)filter_by(user_id=recipient_uid)的條件沒(méi)有問(wèn)題。接著,我懷疑是不是數(shù)據(jù)庫(kù)連接出了問(wèn)題,導(dǎo)致查詢結(jié)果不一致,但檢查后發(fā)現(xiàn)數(shù)據(jù)庫(kù)連接也是正常的。

然后,我開始懷疑是不是數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別的問(wèn)題,甚至去查了SQLAlchemy的文檔,看看是不是有什么隱藏的坑。但折騰了半天,依然沒(méi)有找到原因。

最后,我決定直接查看數(shù)據(jù)庫(kù)表結(jié)構(gòu),這才發(fā)現(xiàn)了問(wèn)題的關(guān)鍵:我把user_id設(shè)置成了主鍵(Primary Key)。

為什么主鍵會(huì)導(dǎo)致這個(gè)問(wèn)題?

在數(shù)據(jù)庫(kù)中,主鍵的唯一作用是唯一標(biāo)識(shí)一條記錄。也就是說(shuō),主鍵的值必須是唯一的,不能重復(fù)。而我錯(cuò)誤地把user_id設(shè)置成了主鍵,這意味著每個(gè)user_id只能對(duì)應(yīng)一條記錄。

所以,當(dāng)我執(zhí)行查詢時(shí):

conversation_messages = ConversationModel.query.filter_by(user_id=recipient_uid).all()

由于user_id是主鍵,數(shù)據(jù)庫(kù)只會(huì)返回唯一一條記錄,即使實(shí)際上有多條記錄符合條件。這就是為什么count是9,但查詢結(jié)果卻只有1條的原因。

問(wèn)題的解決

找到原因后,解決方法就很簡(jiǎn)單了:去掉user_id的主鍵約束。因?yàn)橐粋€(gè)用戶可能會(huì)有多條對(duì)話記錄,所以u(píng)ser_id不應(yīng)該作為主鍵。正確的做法是使用一個(gè)獨(dú)立的字段(比如id)作為主鍵,而user_id只作為普通字段。

修改后的表結(jié)構(gòu)如下:

class ConversationModel(db.Model):
    id = db.Column(db.String, primary_key=True, default=lambda: str(uuid.uuid4()))
    user_id = db.Column(db.String)  # 普通字段,不再作為主鍵
    message = db.Column(db.String)
    # 其他字段...

修改后,重新運(yùn)行代碼,count和conversation_messages的結(jié)果終于一致了!

反思與總結(jié)

這次經(jīng)歷讓我深刻體會(huì)到,數(shù)據(jù)庫(kù)設(shè)計(jì)中的每一個(gè)細(xì)節(jié)都可能對(duì)功能產(chǎn)生重大影響。主鍵的設(shè)置看似簡(jiǎn)單,但如果用錯(cuò)了地方,就會(huì)引發(fā)意想不到的問(wèn)題。以下是我總結(jié)的幾點(diǎn)經(jīng)驗(yàn):

  • 主鍵的唯一性:主鍵的作用是唯一標(biāo)識(shí)一條記錄,不能重復(fù)。如果一個(gè)字段的值可能重復(fù)(比如user_id),就不適合作為主鍵。
  • 數(shù)據(jù)庫(kù)設(shè)計(jì)要結(jié)合實(shí)際業(yè)務(wù):在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),一定要結(jié)合業(yè)務(wù)需求,確保表結(jié)構(gòu)和字段設(shè)置符合實(shí)際場(chǎng)景。
  • 排查問(wèn)題要全面:遇到問(wèn)題時(shí),不要只盯著代碼,還要檢查數(shù)據(jù)庫(kù)表結(jié)構(gòu)、數(shù)據(jù)狀態(tài)等可能的影響因素。

這次經(jīng)歷雖然讓我折騰了2個(gè)小時(shí),啊啊?。〉沧屛覍W(xué)到了很多。希望我的這段“踩坑”經(jīng)歷能對(duì)大家有所幫助。如果你也遇到過(guò)類似的問(wèn)題,歡迎在評(píng)論區(qū)分享你的故事!畢竟,程序員的世界里,解決問(wèn)題的方式千奇百怪,但最終的目標(biāo)都是一樣的:寫出更好的代碼,做出更好的產(chǎn)品!

責(zé)任編輯:趙寧寧 來(lái)源: 老貓coder
相關(guān)推薦

2020-05-02 15:10:53

AI 王者榮耀人工智能

2021-10-08 08:09:13

Facebook算法DNS

2021-04-29 23:45:07

函數(shù)式接口可用性

2018-10-17 09:47:38

微博搜索全面技術(shù)儲(chǔ)備

2024-11-11 14:57:56

JWTSession微服務(wù)

2022-08-01 09:43:19

程序員Googlefacebook

2024-11-19 08:36:16

2010-08-18 17:06:02

DB2數(shù)據(jù)庫(kù)編譯

2013-03-21 10:03:04

Perl

2022-02-16 16:36:55

阿里面試面試流程背景

2021-05-11 16:20:02

網(wǎng)站HTTPHTTPS

2021-09-13 08:38:42

阿里時(shí)間成本

2021-08-26 07:43:45

B+ 樹索引磁盤

2023-04-21 18:48:18

谷歌人工智能開源

2021-10-11 11:05:30

技術(shù)資訊

2021-11-22 07:42:47

稅前個(gè)稅工資

2021-03-01 08:05:09

慢查詢SQL

2022-07-01 06:44:42

微信應(yīng)用偽裝應(yīng)用轉(zhuǎn)生

2025-09-08 09:08:01

2009-07-01 14:49:52

JSP空間租用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)