Вставить запись datetime в таблицу с типом данных TIMESTAMP

Я пытаюсь создать систему (с ботом Discord, но это не имеет отношения к этому), где он перечисляет нарушения пользователя, например, когда это произошло, где, почему и т. Д., И мне нужен тип данных "date", который регистрирует отметка времени, когда это произошло.

Я пробовал иметь DATE тип данных должен быть "отметка времени" (также как "дата и время", но происходит та же ошибка)

conn1 = apsw.Connection('./dbs/warns.db')
warns = conn1.cursor()

warns.execute(
    """
    CREATE TABLE IF NOT EXISTS warns
    (id INTEGER PRIMARY KEY AUTOINCREMENT,
    date timestamp,
    server string,
    user string,
    author string,
    reason string)
    """
)

def add_warn(guild: str, user: str, author: str, reason):
    now = datetime.datetime.utcnow()
    with conn1:
        warns.execute("INSERT INTO warns (date, server, user, author, reason) VALUES (?, ?, ?, ?, ?)", (now, guild, user, author, reason))

Я получаю TypeError: Bad binding argument type supplied - argument #1: type datetime.datetime ошибка

1 ответ

Решение

Из синтаксиса оператора create table (AUTOINCREMENT без подчеркивания) и apsw, я подозреваю, что вы используете базу данных SQLite.

Если вы хотите вставить текущую метку времени в timestampcolumn, мое первое предложение - сделать это непосредственно в SQL, а не использовать переменную, сгенерированную в python. В sqlite,CURRENT_TIMESTAP дает вам текущую дату / время в качестве отметки времени:

warns.execute(
    "INSERT INTO warns (wdate, server, user, author, reason) VALUES (CURRENT_TIMESTAMP, ?, ?, ?, ?)", 
    (guild, user, author, reason)
)

Другой вариант, который еще больше упростит ваш код, - установить значение по умолчанию для столбца отметки времени при создании таблицы. Затем вы можете просто игнорировать этот столбец при вставке и не сомневаться, что будет присвоено правильное значение:

warns.execute(
    """
        CREATE TABLE IF NOT EXISTS warns (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            wdate timestamp DEFAULT CURRENT_TIMESTAMP,
            server string,
            user string,
            author string,
            reason string
        )
    """
)

def add_warn(guild: str, user: str, author: str, reason):
    with conn1:
        warns.execute(
            "INSERT INTO warns (server, user, author, reason) VALUES (?, ?, ?, ?)", 
            (now, guild, user, author, reason)
        )

Примечание: dateне является разумным именем столбца, поскольку оно конфликтует с именем типа данных. Я переименовал этоwdate во всем приведенном выше коде.

Другие вопросы по тегам