如何在Python中使用列表作为SQLite参数

480 阅读4分钟

5/5 - (1票)

问题的提出和解决方案概述

本文通过使用IN命令的SQLite查询,与虚构的Finxter数据库一起工作,以检索三(3)个特定用户。

要跟上进度,请点击 这里 下载该文件并将其移至当前工作目录。


准备工作

在代码片段的顶部添加以下代码。这个代码段将使本文中的代码能够无错误地运行。

import sqlite3

💡注意:SQLite库内置于Python中,不需要安装,但必须被引用。


概述

Finxter 数据库文件包含25条记录的 [tuple](https://blog.finxter.com/the-ultimate-guide-to-python-tuples/)格式的记录。下面是这个文件的一个片段。

(30022145, 'Steve', 'Hamilton', 'Authority')
(30022192, 'Amy', 'Pullister', 'Beginner')
(30022331, 'Peter', 'Dunn', 'Basic Knowledge')
(30022345, 'Marcus', 'Williams', 'Experienced Learner')
(30022359, 'Alice', 'Miller', 'Authority')
(30022361, 'Craig', 'Driver', 'Autodidact')
...

users 表的结构如下。

数据类型字段名
INTEGER识别码
文本姓氏
TEXT姓氏
TEXT排名

现在,概述已经完成,让我们连接到数据库,过滤,并输出结果。


连接到SQLite数据库

这段代码连接到一个SQLite数据库,并放在一个try/except语句中以捕捉任何可能的错误。

try:
    conn = sqlite3.connect('finxter_users.db')
    cur  = conn.cursor()

except Exception as e:
    print(f'An error occurred: {e}.')
    exit()

try 语句中的代码首先执行,并尝试连接到finxter_users.db 。如果成功的话,会产生一个与下面类似的连接对象conn )。

<sqlite3.Connection object at 0x00000194FFBC2140>

接下来,上面创建的连接对象(conn)和cursor() 一起被用来创建一个游标对象。如果成功的话,会产生一个与下面类似的游标对象(cur)。

<sqlite3.Cursor object at 0x0000022750E5CCC0>

💡注意: Cursor对象允许与数据库的具体情况进行交互,例如执行查询。

如果以上几行失败,代码会落在except ,捕捉到错误(e),并输出到终端。代码的执行就会停止。


准备好SQLite查询

在执行任何查询之前,你必须决定预期的结果以及如何实现这个结果。

try:
    conn = sqlite3.connect('finxter_users.db')
    cur  = conn.cursor()

    fid_list  = [30022192, 30022450, 30022475]
    fid_tuple = tuple(fid_list)
    f_query   = f'SELECT * FROM users WHERE FID IN {format(fid_tuple)}'

except Exception as e:
    print(f'An error occurred: {e}.')
    exit()

在这个例子中,三(3)行突出显示了创建、配置和保存以下变量。

  • **fid_list**:这包含一个 list要检索的选定用户的 FID
  • **fid_tuple**:这将fid_list 转换为一个 [tuple](https://blog.finxter.com/the-ultimate-guide-to-python-tuples/)格式。这样做是为了匹配数据库的格式(见上文)。
  • **f_query**:这构建了一个SQLite查询,执行时返回所有匹配的记录。

查询字符串 输出

如果f_query 被输出到终端(print(`f_query`)),将显示以下内容。很完美!这正是我们想要的。

SELECT * FROM users WHERE FID IN (30022192, 30022450, 30022475)

执行SQLite查询

让我们执行上面创建的查询并保存结果。

try:
    conn = sqlite3.connect('finxter_users.db')
    cur  = conn.cursor()

    fid_list  = [30022192, 30022450, 30022475]
    fid_tuple = tuple(fid_list)
    f_query   = f'SELECT * FROM users WHERE FID IN {format(fid_tuple)}'
    results   = cur.execute(f_query)
except Exception as e:
    print(f'An error occurred: {e}.')
    exit()

突出显示的一行是将 execute()方法附加到游标对象上,并将f_query 字符串作为参数。

如果执行成功,就会产生一个可迭代的 游标对象,类似于下面。

<sqlite3.Cursor object at 0x00000224FF987A40>

显示查询结果

显示查询结果的标准方法是使用一个 for一个循环。
我们可以在 try/except
语句的内部/外部添加这个循环。

try:
    conn = sqlite3.connect('finxter_users.db')
    cur  = conn.cursor()

    fid_list  = [30022192, 30022450, 30022475]
    fid_tuple = tuple(fid_list)
    f_query   = f'SELECT * FROM users WHERE FID IN {format(fid_tuple)}'
    results   = cur.execute(f_query)
except Exception as e:
    print(f'An error occurred: {e}.')
    exit()

for r in results:
    print(r)
conn.close()

突出显示的几行实例化了一个for循环,每次浏览一条记录的查询结果并将其输出到终端。

查询结果

(30022192, 'Amy', 'Pullister', 'Beginner')
(30022450, 'Leon', 'Garcia', 'Authority')
(30022475, 'Isla', 'Jackson', 'Scholar')

最后,需要关闭之前创建的连接对象


总结

在这篇文章中,你学会了如何。

  • 创建一个连接对象。
  • 创建一个Cursor对象。
  • 构建并执行一个SQLite查询。
  • 将结果输出到终端。

我们希望你喜欢这篇文章。

编码愉快!


幽默的程序员

👱‍♀️ 程序员1:我们有一个问题
🧔‍♂️ 程序员2:让我们使用RegEx!
👱‍♀️ 程序员1

:现在我们有两个问题

......然而--当你打磨你的 "Python中的RegEx超级能力"时,你可以很容易地将这两个问题减少到零。🙂