Вставьте запись даты и времени в таблицу с типом данных TIMESTAMP - PullRequest
1 голос
/ 06 октября 2019

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

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

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 Ответ

1 голос
/ 07 октября 2019

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

Если вы хотите вставить текущуюотметка времени для столбца timestamp, мое первое предложение - сделать это непосредственно в 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 во всем приведенном выше коде.

...