热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在使用python将数据插入sqlite3时在重复条目上引发错误消息?

如何解决《如何在使用python将数据插入sqlite3时在重复条目上引发错误消息?》经验,为你挑选了1个好方法。

伙计我正在使用sqlite3和python tkinter作为前端.数据库很简单,有两个字段,用户名密码.我想进行注册注册页面.其中两个字段中给出的数据存储在sqlite3数据库中.数据正确插入.但是,当数据库中已存在提供的用户名时,我想显示一个消息框.我尝试了下面的代码.

我的代码:

def signup():
    userID = username.get()
    passwd = password.get()
    cOnn= sqlite3.connect('test.db')
    c = conn.cursor()
    result = c.execute("SELECT * FROM userstable")

    for i in result:
        if i[0] == userID:
            messagebox.showerror("DUPLICATE", "USER ALREADY EXISTS!")

    else:
        cOnn= sqlite3.connect('test.db')
        c = conn.cursor()
        c.execute("INSERT INTO userstable VALUES (?, ?)", (userID, passwd))
        conn.commit()
        c.close()
        conn.close()
        username.delete(0,END)
        password.delete(0,END)
        username.focus()
        messagebox.showinfo("SUCCESS", "USER CREATED SUCCESSFULLY")

这可以工作,但仍然会在错误消息之后存储重复数据.如果用户名已经可用,我的要求是抛出错误并停止执行.如果用户名不可用,则应插入数据.

我哪里错了?有人可以通过指出来解释我,还是有其他方法可以达到这个目的?看来我需要修改一些功能.请指导我.

编辑1

如果我尝试使用三个条件,则休息不起作用.

我的代码

def data_entry():
    cOnn= sqlite3.connect('test.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS userstable(username TEXT, password TEXT)')
    username = uname.get()
    password = passwd.get()

    result = c.execute("SELECT * FROM userstable")

    if username != '' or password != '':

        for i in result:
            if i[0] == username:
                tkinter.messagebox.showerror("DUPLICATE", "USER ALREADY EXISTS!")
                break
        else: 
            c.execute('INSERT INTO userstable (username, password) VALUES(?, ?)',(username,password))
            conn.commit()
            c.close()
            conn.close()
            another_clear()
            tkinter.messagebox.showinfo("Success", "User Created Successfully,\nPlease restart application.")

    else:
        tkinter.messagebox.showerror("ERROR", "Fill both fields!")

小智.. 5

解决此问题的更好方法是在表上创建唯一约束(索引,在sqlite中)以防止插入重复的用户名.这样,你可以尝试/除了insert语句,而不是循环遍历所有用户的列表,看它是否已经存在(那是不可扩展的).这也会阻止你"选择*",这通常是不好的做法(尽量明确).

https://sqlite.org/lang_createtable.html

因此,您可以将约束添加为唯一索引或主键.如果此表中只有2列,或者如果您有2个以上但没有其他ID,则您的用户名可以是您的主键.如果您要为用户引入系统ID,我会将其用作主键和用户名作为唯一索引.无论哪种方式,您都需要更改表以添加约束.

CREATE UNIQUE INDEX username_uidx ON userstable (username);

同样,因为您没有明确地让我们知道列名称,所以您必须填写它.

之后:

try:
    cOnn= sqlite3.connect('test.db')
    c = conn.cursor()
    c.execute("INSERT INTO userstable VALUES (?, ?)", (userID, passwd))
    conn.commit()
except: # I'm not sure the exact error that's raised by SQLite
    messagebox.showerror("DUPLICATE", "USER ALREADY EXISTS!")
finally:
    c.close()
    conn.close()

我通常将我的光标和连接包装在finally中,以便即使存在异常也会关闭它们.这不是你所需要的100%,但它应该让你在一步中通过更好的数据库设计来强制执行用户的唯一性.



1> 小智..:

解决此问题的更好方法是在表上创建唯一约束(索引,在sqlite中)以防止插入重复的用户名.这样,你可以尝试/除了insert语句,而不是循环遍历所有用户的列表,看它是否已经存在(那是不可扩展的).这也会阻止你"选择*",这通常是不好的做法(尽量明确).

https://sqlite.org/lang_createtable.html

因此,您可以将约束添加为唯一索引或主键.如果此表中只有2列,或者如果您有2个以上但没有其他ID,则您的用户名可以是您的主键.如果您要为用户引入系统ID,我会将其用作主键和用户名作为唯一索引.无论哪种方式,您都需要更改表以添加约束.

CREATE UNIQUE INDEX username_uidx ON userstable (username);

同样,因为您没有明确地让我们知道列名称,所以您必须填写它.

之后:

try:
    cOnn= sqlite3.connect('test.db')
    c = conn.cursor()
    c.execute("INSERT INTO userstable VALUES (?, ?)", (userID, passwd))
    conn.commit()
except: # I'm not sure the exact error that's raised by SQLite
    messagebox.showerror("DUPLICATE", "USER ALREADY EXISTS!")
finally:
    c.close()
    conn.close()

我通常将我的光标和连接包装在finally中,以便即使存在异常也会关闭它们.这不是你所需要的100%,但它应该让你在一步中通过更好的数据库设计来强制执行用户的唯一性.


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
author-avatar
php小学生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有