python - 是否有一个 sqlite 函数来检查单元格值是否存在
问题描述
我正在处理这个由 3 列组成的简单表
ID
这只是所有行的序列号 (PRIMARY KEY NOT NULL
)PCode
其中有给产品的代码 (INTEGER
)PName
具有产品名称 (TEXT
)
我想创建一个 tkinter 窗口,让用户将新产品(代码和名称)添加到此表中。但它首先需要检查该产品代码或名称是否已经存在,如果产品名称存在,则显示窗口错误,如果产品代码存在,则给它用户分配的名称。如果产品代码和名称尚不存在,请插入包含它们的新行。如何让 sqlite 检查文本或整数是否已经存在?谢谢你。
解决方案
Normall 方法SELECT
用于检查数据库中是否已有值。如果结果为零,则可以添加新值。
像这样的东西(它可能还需要cursor
,fetch()
或fetchall()
等)
results = db.execute("SELECT ...")
if results:
#... code ...
#or
if len(results) > 0:
#... code ...
可能您可能必须使用两个SELECT
查询来完成
results = db.execute("SELECT ... FROM ... WHERE PName = ... ")
if results:
print("ERROR: PName exists with PCode", results[0])
else:
results = db.execute("SELECT ... FROM ... WHERE PCode = ... ")
if results:
print("PCode exists with PName", results[1])
db.execute("UPDATE ...")
else:
db.execute("INSERT ...")
编辑:
最少的工作代码
import sqlite3
# --- functions ---
def drop_db(db):
db.execute('''DROP TABLE IF EXISTS product''')
db.commit()
def create_db(db):
db.execute('''CREATE TABLE IF NOT EXISTS product (
id INTEGER PRIMARY KEY,
PCode INTEGERT,
PName TEXT
);''')
db.commit()
def insert_example_data(db):
db.execute("INSERT INTO product (PCode, PName) VALUES (1, 'Phone')")
db.execute("INSERT INTO product (PCode, PName) VALUES (2, 'Car')")
db.commit()
def test(db, code, name):
print('--- test:', name, code, '---')
result = db.execute("SELECT * FROM product WHERE PName=?", (name,)).fetchone()
if result:
print('ERROR PName exists with PCode:', result[1], 'and ID:', result[0])
else:
result = db.execute("SELECT * FROM product WHERE PCode=?", (code,)).fetchone()
if result:
print('PCode exists with PName:', result[2], 'and ID:', result[0])
print('UPDATE PName to:', name)
db.execute('UPDATE product SET PName=? WHERE Pcode=?', (name, code))
db.commit()
else:
print('INSERT')
db.execute('INSERT INTO product (PCode, PName) VALUES (?, ?)', (code, name))
db.commit()
def display(db, code=None, name=None):
print('--- display', code, name, '---')
if code is None and name is None:
print('** need code and/or name **')
return
if code is not None and name is None:
results = db.execute("SELECT * FROM product WHERE PCode=?", (code,))
if code is None and name is not None:
results = db.execute("SELECT * FROM product WHERE PName=?", (name,))
if code is not None and name is not None:
results = db.execute("SELECT * FROM product WHERE PCode=? AND PName=?", (code, name,))
for row in results:
print(row)
# --- main ---
db = sqlite3.Connection("data.sqlite")
drop_db(db)
create_db(db)
insert_example_data(db)
test(db, 3, 'Car')
test(db, 7, 'Boat')
test(db, 7, 'House')
display(db, code=7)
display(db, name='Boat')
display(db, name='House')
display(db)
db.close()
推荐阅读
- java - 如何在 Harmony App Development 中动态更改对话框中设置的动画组件的大小?
- javascript - webpack 开发服务器无法正常工作
- discord.py - 有没有办法循环由斜杠命令创建的嵌入,以便每隔几个小时发送一次?
- nginx - Nginx 不访问服务器上的静态文件
- ocaml - 类型级 Peano 算术:类型构造函数将逃脱其范围
- reactjs - 材质ui时间选择器应该传递什么格式?
- javascript - 将样式转移图像应用于圆形蒙版 P5.js
- android - RecyclerView 在滚动时覆盖 ImageView
- node.js - 瓶颈库作业停止执行
- python - 如何使用 pandas 使用列名检查 CSV 中的重复名称、mac 地址和 mac 地址长度