SQLite3将列参数作为变量传递

时间:2020-05-01 04:05:39

标签: python sql sqlite

我正在尝试在Python中创建一个SQL请求,该请求应根据模式(今天之前来自不同列的条目)而定。 因此,我想创建一个采用不同列参数的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 个答案:

答案 0 :(得分:2)

您无法参数化列名,但可以用字符串替换它们。
对于参数替换,请确保对SQLite3使用正确的占位符,该占位符为?
然后.execute()的第二(第二个)参数必须是一个序列;这是一个元组。

qry = """SELECT ID FROM vocabulary WHERE {col_} <= ?""".format(**values) 
crs.execute(qry, (datetime.datetime.now().isoformat(),))