Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite/Python数据库检索与比较_Python_Sqlite - Fatal编程技术网

SQLite/Python数据库检索与比较

SQLite/Python数据库检索与比较,python,sqlite,Python,Sqlite,目前,我有一个包含用户名、密码等的数据库。 我想查一下数据库,看看是否有重复的 con = lite.connect('userInfo.db') with con: cur = con.cursor() cur.execute("SELECT * FROM Users WHERE LOWER(Username) = LOWER(?)", (newID,)) rows = cur.fetchall() if len(rows)!=0: return

目前,我有一个包含用户名、密码等的数据库。 我想查一下数据库,看看是否有重复的

con = lite.connect('userInfo.db')
with con:
    cur = con.cursor()
    cur.execute("SELECT * FROM Users WHERE LOWER(Username) = LOWER(?)", (newID,))
    rows = cur.fetchall()
    if len(rows)!=0:
        return "Duplicate detected"
这是我目前的代码
newID
是一个新名称,我希望检查数据库中是否存在同名的现有条目

我的问题是——我在代码中这样做是一个好主意吗?我主要关心我的方法。我是否应该使用除
fetchall()
之外的其他内容

谢谢你抽出时间!:)
请注意,这是针对网站应用程序的。

为什么不将SQLite中的字段设置为唯一,这将首先防止重复条目。

这里有一种方法可以完全满足您的要求-找出给定的

用户名是否已经存在:

import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute ("""
              CREATE TABLE users (
                  uid INTEGER PRIMARY KEY AUTOINCREMENT,
                  username TEXT UNIQUE,
                  email TEXT UNIQUE );
             """)

test_users = (
    {'username':"Alice",    'email':"Alice@mail.com"},
    {'username':"Billy",    'email':"Billy@mail.com"},
    {'username':"Charles",  'email':"Charles@mail.com"},
    {'username':"Dick",     'email':"Dick@mail.com"},
    {'username':"Emily",    'email':"Emily@mail.com"},
    {'username':"Faramir",  'email':"Faramir@mail.com"},
)

for user in test_users:
    conn.execute("INSERT INTO users (username, email) VALUES (?,?)",
                 (user['username'],user['email'])
                )

result = conn.execute("SELECT COUNT(*) FROM users WHERE username='Alice'")
number_of_Alices = result.next()[0] # number_of_Alices will be 1
因为您只需要一个
计数
就足够了


但实际上,您不应该自己强制实现用户名的唯一性。通过将字段指定为
唯一
主键
,让数据库为您执行此操作

如果您尝试插入
“Alice”alice@wonderland.com“
在像上面那样创建数据库之后,这将得到一个sqlite3.IntegrityError:

>>> conn.execute("""INSERT INTO users (username, email)
...                     VALUES ("Alice", "alice@wonderland.com");""")
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
sqlite3.IntegrityError: column username is not unique
顺便说一句,使用大写/小写函数时要非常小心。
“Гааааааааааааааааа


既然您提到这是针对Web应用程序的,我就提醒您将密码存储为(绝不是纯文本!),并通过使用用于SQL查询的
(?,?,?,?,?,…)
占位符来防止SQL注入,而不是
(%s,%s)%(var1,var2)
字符串插值方法

引述:

通常,SQL操作需要使用Python中的值 变量。您不应该使用Python的字符串组合查询 因为这样做是不安全的;它使你的程序 易受SQL注入攻击

相反,使用DB-API的参数替换。放?作为一个 在需要使用值的任何位置使用占位符,然后提供元组 作为游标的execute()方法的第二个参数的值。 (其他数据库模块可能使用不同的占位符,例如%s或%s。) :1.)例如:


如果您不这样做,那么有人可以请求用户名
Robert Menzies;删除表用户
with.

如果检测到重复条目,会发生什么情况?@Vincent如果将用户名column设置为唯一,并且使用现有用户名插入用户表,则会导致失败。e、 从一开始就不会有任何重复。那么我的程序本质上会“崩溃”吗?对不起,我是新来的,刚开始做编码。非常感谢您的帮助。您将得到一个
SQLite3.OperationalError
,上面写着“出了问题”。如果可以合理预期重复的用户名,您可以使用
try。。。除了
阻塞和恢复。如果一开始就不应该尝试重复用户名,那么崩溃是正常的。而且
username
字段实际上应该是
PRIMARY KEY
。也就是说,使用一个单独的
用户id整数主键自动递增
用户名文本唯一
可能是一种更好的方法-这样,
用户名
中的奇怪字符就不会引起错误(您的代码是否正确处理用户名“Гаааааааааааааа用户可以随意更改用户名(因为它没有被用作任何其他地方的密钥)。为了节省内存,考虑用<代码> FECTONE()/代码>替换<代码> FETRAG()/<代码>。谢谢您的详细解释。非常感谢。只是出于好奇,
robertmenzies;删除表用户实际做什么以及为什么?丹!实际上,名称应该是
robertmenzies);删除表用户。然后,如果您的查询类似于
“插入用户值(%s)”%username
,那么在变量替换之后,您将有
“插入用户值”(Robert Menzies);DROP TABLE users;
-这会将
Robert Menzies
插入
users
表,然后删除整个
users
表。这称为SQL注入攻击,这是可能的,因为
字符结束SQL命令并开始新的命令。您必须做的事情之一是转义
>用户输入中的字符,这样就不会发生这种情况。在
sqlite3
文档中使用建议的做法-
(?,?,?…)
占位符,可以防止这种攻击和其他攻击。哦!非常有趣。谢谢。
try:
    conn.execute("""INSERT INTO users (username, email)
                    VALUES ("Alice", "alice@wonderland.com");""")
except sqlite3.IntegrityError:
    print ("Username 'Alice' was already taken.")