获取用户输入并使用 Pandas DataFrame 从 LEFT JOIN 中提取数据时出错

Error while getting user input and using Pandas DataFrame to extract data from LEFT JOIN

我正在尝试在 Python 3 中创建 Sqlite3 语句以从两个名为 FreightCargo & Train 的 table 收集数据,其中列车 ID 是输入值。我想使用 Pandas 因为它很容易阅读 tables.

我创建了下面的代码,它运行良好,但它是静态的,并且只在语句中查找给定的一行。

import pandas as pd
SQL = '''SELECT F.Cargo_ID, F.Name, F.Weight, T.Train_ID, T.Assembly_date 
                         FROM FreightCargo F LEFT JOIN [Train] T
                         ON F.Cargo_ID = T.Cargo_ID
                         WHERE Train_ID = 2;'''
cursor = conn.cursor()
cursor.execute( SQL )
names = [x[0] for x in cursor.description]
rows = cursor.fetchall()
Temp = pd.DataFrame( rows, columns=names)
Temp'''

我希望能够创建带有输入的变量。然后将根据用户提供的内容来确定此操作的结果。例如,要求用户输入 train_id,它是 table 中的主键,将列出与火车的关系。

我扩展了代码,但出现错误:ValueError: operation parameter must be str

Train_ID = input('Train ID')
SQL = '''SELECT F.Cargo_ID, F.Name, F.Weight, T.Train_ID, T.Assembly_date 
                         FROM FreightCargo F LEFT JOIN [Train] T
                         ON F.Cargo_ID = T.Cargo_ID
                         WHERE Train_ID = ?;''', (Train_ID)
cursor = conn.cursor()
cursor.execute( SQL )
names = [x[0] for x in cursor.description]
rows = cursor.fetchall()
Temp = pd.DataFrame( rows, columns=names)
Temp

问题出在您对 SQL 变量的定义上。

您正在创建一个包含两个元素的 tuple/collection。如果你打印 type(SQL) 你会看到这样的东西:('''SELECT...?;''', ('your_user's_input')).

当您将其传递给 cursor.execute(sql[, parameters]) 时,它需要一个字符串作为第一个参数,并带有“可选”参数。您的参数并不是真正可选的,因为它们是由您的 SQL-query 的 [Train] 定义的。参数必须是集合,例如元组。

您可以使用 cursor.execute(*SQL) 展开 SQL 语句,这会将 SQL 列表的每个元素作为不同的参数传递,或者您可以将参数移动到执行函数.

Train_ID = input('Train ID')
SQL = '''SELECT F.Cargo_ID, F.Name, F.Weight, T.Train_ID, T.Assembly_date 
                         FROM FreightCargo F LEFT JOIN [Train] T
                         ON F.Cargo_ID = T.Cargo_ID
                         WHERE Train_ID = ?;'''
cursor = conn.cursor()
cursor.execute( SQL, (Train_ID,) )
names = [x[0] for x in cursor.description]
rows = cursor.fetchall()
Temp = pd.DataFrame( rows, columns=names)
Temp