我需要一个 SQL table 来更新一个单元 # 而不是在它检测到一个单元已经存在时创建一个新条目
I need an SQL table to update a Unit # instead of creating a new entry if it detects a Unit already exists
我正在尝试建立一个数据库来管理居住在封闭式社区中的居民。目标是创建一个功能,使 属性 经理可以轻松填写表格,然后将信息提交到数据库中。如果 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)
您正在描述一个 upsert
查询。在 SQLite 中,这是通过 on conflict
.
实现的
为此,您需要对列 unit
设置唯一约束 - 或者将该列用作主键。
然后,您可以按如下方式对查询进行表述。我减少了可读性的列数......并且因为我怀疑你的设计 - 这 15 guest
列可能应该是另一个 table.
中的行
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 中的一个很好的做法。
我正在尝试建立一个数据库来管理居住在封闭式社区中的居民。目标是创建一个功能,使 属性 经理可以轻松填写表格,然后将信息提交到数据库中。如果 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)
您正在描述一个 upsert
查询。在 SQLite 中,这是通过 on conflict
.
为此,您需要对列 unit
设置唯一约束 - 或者将该列用作主键。
然后,您可以按如下方式对查询进行表述。我减少了可读性的列数......并且因为我怀疑你的设计 - 这 15 guest
列可能应该是另一个 table.
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 中的一个很好的做法。