我正在编写一个小程序,让我可以通过资产编号、序列号等搜索 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
输出到终端。
将
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 文档
中所述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()括号中传递参数。