Как правило, параметризация используется для литеральных значений, а не идентификаторов (т. Е. Имен таблиц или столбцов). Вам нужно будет запустить интерполяцию строк, например str.format()
, чтобы динамически передавать входную переменную Python в запрос SQL. Однако такой подход может привести к внедрению SQL-кода, особенно из-за пользовательского ввода.
Вместо этого рассмотрите возможность нормализации широкоформатного формата в длинный формат. Это более эффективная, масштабируемая структура хранения, в которой не используются элементы данных (например, такие как ColdDrink , HotDrink ) в качестве отдельных столбцов. Любой новый продукт не требует реструктуризации таблицы с новым столбцом. Затем вы можете запустить свой параметризованный запрос. Чтобы имитировать формат длинной таблицы, вы можете запустить подзапрос UNION
(или как CTE).
title = input("Enter column to search")
sql = """SELECT SUM(sub.sales) as total_sales,
strftime("%m-%Y", sub.[Date]) as 'month-year'
FROM
(SELECT [Date], ColdDrink AS sales, 'ColdDrink' as item
FROM TotalDaySales
UNION ALL
SELECT [Date], HotDrink AS sales, 'HotDrink' as item
FROM TotalDaySales
UNION ALL
SELECT [Date], Cake AS sales, 'Cake' as item
FROM TotalDaySales
UNION ALL
SELECT [Date], Smoothie AS sales, 'Smoothie' as item
FROM TotalDaySales
UNION ALL
SELECT [Date], DecafDrink AS sales, 'DecafDrink' as item
FROM TotalDaySales
) AS sub
WHERE sub.[item] = ?
GROUP BY strftime("%m-%Y", sub.[Date])
"""
aggregateIndividuals = cur.execute(sql, title).fetchall()
В качестве альтернативы, используя выражение общей таблицы (CTE) через предложение WITH
, доступное в SQLite 3.8.3
sql = """WITH sub AS
(SELECT [Date], ColdDrink AS sales, 'ColdDrink' as item
FROM TotalDaySales
UNION ALL
...)
SELECT SUM(sub.sales) as total_sales,
strftime("%m-%Y", sub.[Date]) as 'month-year'
FROM sub
WHERE sub.[item] = ?
GROUP BY strftime("%m-%Y", sub.[Date])
"""
aggregateIndividuals = cur.execute(sql, title).fetchall()
Чтобы было ясно, в идеале вы не используете запрос UNION
, а реструктурируете таблицу в длинном формате:
CREATE TABLE TotalDaySalesLong AS
(SELECT [Date], ColdDrink AS sales, 'ColdDrink' as item
FROM TotalDaySales
UNION ALL
...)