如何成功地将变量传递到我的 sqlite SELECT 语句中?

问题描述 投票:0回答:2

我正在编写一个小程序,让我可以通过资产编号、序列号等搜索 sqlite 数据库

assets
。问题是我不确定是否必须将用户输入(变量
assetNum
)传递到我的数据库中。 sqlite
SELECT
语句。我希望它获取用户查询的
assetNum
并从 sqlite 表返回该行。

首先,我定义了我的函数:

def search_asset_num(conn):

    cur = conn.cursor()
    cur.execute("SELECT * FROM assets WHERE AssetNumber = '{}'".format(assetNum))

    rows = cur.fetchall()

    for row in rows:
        print(row)

在程序中,我利用用户输入在菜单中移动,因此稍后在程序中,当我进入“按资产菜单搜索”时,我有:

   elif selection == '2':

            menu2 = {}
            menu2['        1'] = "Search Assets by Name"
            menu2['        2'] = "Search Assets by Asset Number"
            menu2['        3'] = "Search Assets by Serial Number"
            menu2['        4'] = "Search Assets by Ownership"
            menu2['        5'] = "Go back!"

            choices2 = menu2.keys()
            for entry in choices2:
                print(entry, menu2[entry])

            selection2 = input("Enter number: ")

            if selection2 == '2':

                assetNum = input("Enter Asset Number: ")

                search_asset_num(conn)

据我所知,问题在于

assetNum
出现在上面的
search_asset_num()
函数中,而它实际上在
if
语句中定义为
assetNum = input("Enter Asset Number: ")
。我不知道如何解决这个问题。我尝试在代码的最顶部将
assetNum
设置为全局,并将其设置为等于
0
作为占位符,但这不起作用。它只是将
0
输出到终端。

python python-3.x sqlite
2个回答
3
投票

assetNum
添加为函数的参数,

def search_asset_num(conn, assetNum):
    cur = conn.cursor()
    cur.execute("SELECT * FROM assets WHERE AssetNumber = ?", (assetNum,))
    rows = cur.fetchall()
    for row in rows:
        print(row)

在您的菜单中,您可以进行如下更改:

        if selection2 == '2':
            assetNum = input("Enter Asset Number: ")
            search_asset_num(conn, assetNum)

还可以使用“参数替换”,如 Python sqlite3 - DB-API 文档

中所述

0
投票

SQLite 允许使用准备好的语句来插入 SQL 语句变量。 这是一个对我有用的 Java 示例。

String sql = "SELECT * FROM Products WHERE ProductCode = ?"

PreparedStatement ps = connection.prepareStatement(sql);

ps.setString(1, productCode);  or ps.setString(1, product.getPrice());

ps.executeQuery();

请注意:不要在executeQuery()括号中传递参数。

© www.soinside.com 2019 - 2024. All rights reserved.