我想创建一个系统(与不和谐的机器人,但是这不是有关这一点),它里面列出用户一样,当它发生了,为什么,哪里等违法行为,我想一个"date"数据类型,它记录的时间戳它发生了。

我试图具有DATE数据类型为"timestamp"(以及"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错误

分析解答

从CREATE TABLE语句的(AUTOINCREMENT没有下划线),语法和apsw标签,我怀疑你正在使用SQLite数据库。

如果您正在寻找当前时间戳插入到timestamp列,我的第一个建议是直接做在SQL,而不是使用python产生的变动。 SQLite中,CURRENT_TIMESTAP给你当前date/time为时间戳:

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在上述所有代码。