我正在嘗試建立一個數據庫來管理居住在封閉式社區中的居民。目標是創建一個功能,使物業經理可以輕松填寫表格,然后將信息提交到數據庫中。如果 unit# 不存在,我需要 SQL 創建一個新條目,但如果該單元確實存在,那么我需要它用新數據覆蓋該 unit# 的條目。這是我目前的代碼。所以基本上我要說的是,我需要它來檢查 :unit 值是否已經存在以及它是否覆蓋了已經存在的數據,而不是僅僅盲目地將數據輸入到適當的列中。def submit(): #logging logger.info("Resident info added for") logger.info(unit.get()) print(logger.level) #Databases conn = sqlite3.connect('rdata.db') c = conn.cursor() c.execute("INSERT INTO rdata VALUES (:name, :unit, :phone1, :phone2, :snote, :snote2, :guest1, :guest2, :guest3, :guest4, :guest5, :guest6, :guest7, :guest8, :guest9, :guest10, :guest11, :guest12, :guest13, :guest14, :guest15)", { 'name': name.get(), 'unit': unit.get(), 'phone1': phone1.get(), 'phone2': phone2.get(), 'snote': snote.get(), 'snote2':snote2.get(), 'guest1': guest1.get(), 'guest2': guest2.get(), 'guest3': guest3.get(), 'guest4': guest4.get(), 'guest5': guest5.get(), 'guest6': guest6.get(), 'guest7': guest7.get(), 'guest8': guest8.get(), 'guest9': guest9.get(), 'guest10': guest10.get(), 'guest11': guest11.get(), 'guest12': guest12.get(), 'guest13': guest13.get(), 'guest14': guest14.get(), 'guest15': guest15.get(), }) conn.commit() conn.close() name.delete(0, END) unit.delete(0, END) phone1.delete(0, END) phone2.delete(0, END) snote.delete(0, END) snote2.delete(0, END) guest1.delete(0, END) guest2.delete(0, END) guest3.delete(0, END) guest4.delete(0, END) guest5.delete(0, END) guest6.delete(0, END) guest7.delete(0, END) guest8.delete(0, END) guest9.delete(0, END) guest10.delete(0, END) guest11.delete(0, END) guest12.delete(0, END) guest13.delete(0, END) guest14.delete(0, END) guest15.delete(0, END)
1 回答

慕容森
TA貢獻1853條經驗 獲得超18個贊
您正在描述一個upsert
查詢。在 SQLite 中,這是通過on conflict
.
為此,您需要對列進行唯一約束unit
- 或者將該列用作主鍵。
然后,您可以按如下方式對查詢進行措辭。我減少了可讀性的列數......并且因為我懷疑你的設計 - 這 15guest
列可能應該是另一個表中的行。
INSERT INTO rdata (name, unit, phone, snote, guest) VALUES (:name, :unit, :phone, :snote, :guest)ON CONFLICT(unit) UPDATE SET name = excluded.name, phone = excluded.phone, snote = excluded.snote, guest = excluded.guest
如果存在具有相同 的行unit
,則查詢會使用新值更新現有行。
請注意,我在 中枚舉了目標列insert
:出于多種原因(例如可維護性),這是 SQL 中的一個很好的做法。
添加回答
舉報
0/150
提交
取消