我想创建一个系统(与不和谐的机器人,但是这不是有关这一点),它里面列出用户一样,当它发生了,为什么,哪里等违法行为,我想一个"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
在上述所有代码。