SQLite3 передает аргумент столбца как переменную - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь создать запрос SQL в Python, который должен получить в зависимости от режима записи до сегодняшнего дня из разных столбцов. Поэтому я хочу создать запрос SQL, который принимает разные аргументы столбцов. К сожалению, я всегда получаю пустые результаты, как только запускаю запрос SQL с переменными. (пробовал как с "?", так и с "методом dict")

def amount_of_testing_data(crs, mode):
    if mode == "kanji_read":
        col = "next_date_kanji_reading"
    elif mode == "kanji_write":
        col = "next_date_kanji_writing"
    elif mode == "kana_read":
        col = "next_date_kana_reading"
    elif mode == "kana_write":
        col = "next_date_kana_writing"
    else:
        return ("Error")

    values = {"col_": col, "date_": datetime.datetime.now().isoformat()}
    print(values)

    crs.execute("""SELECT ID FROM vocabulary WHERE Column=:col_ <= :date_""", values)
    return len(crs.fetchall())

Если я поместил табель непосредственно в запрос, SELECT вернет правильную сумму

def amount_of_testing_data(crs, mode):

    value = {"date_": datetime.datetime.now().isoformat()}

    if mode == "kanji_read":
        crs.execute("""SELECT ID FROM vocabulary WHERE next_date_kanji_reading <= :date_""", value)
    elif mode == "kanji_write":
        crs.execute("""SELECT ID FROM vocabulary WHERE next_date_kanji_writing <= :date_""", value)
    elif mode == "kana_read":
        crs.execute("""SELECT ID FROM vocabulary WHERE next_date_kana_reading <= :date_""", value)
    elif mode == "kana_write":
        crs.execute("""SELECT ID FROM vocabulary WHERE next_date_kana_writing <= :date_""", value)
    else:
        return ("Error")

    return len(crs.fetchall())

Можно ли сделать столбец переменной?

1 Ответ

2 голосов
/ 01 мая 2020

Вы не можете параметризовать имена столбцов, но можете подставить их в строку.
Для подстановки параметров обязательно используйте правильный заполнитель для SQLite3, который является ?.
Затем второй (второй) аргумент для .execute() должен быть последовательностью; здесь это один кортеж.

qry = """SELECT ID FROM vocabulary WHERE {col_} <= ?""".format(**values) 
crs.execute(qry, (datetime.datetime.now().isoformat(),))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...