psycopg2插入数据报integer out of range整数越界错误如何解决
报错根因
Discord生成的用户ID是64位无符号整数,最大值可达18446744073709551615,而PostgreSQL的BIGINT是有符号64位整数,最大仅支持9223372036854775807,当ID超过这个阈值时就会触发数值越界错误,和你拼接SQL的方式也有一定关联。
修复步骤
- 调整id字段类型
推荐直接将id字段设置为TEXT类型,实际开发中Discord Bot基本都采用这个方案,因为你不会对用户ID做加减类的数值运算,存文本不会影响使用,也完全规避了数值越界问题。如果一定要存数值类型,可以改为NUMERIC(20,0),支持存储20位以内的精确整数,足够容纳所有Discord snowflake ID。
修改后的建表语句示例:
cursor.execute("""CREATE TABLE IF NOT EXISTS users ( name TEXT NOT NULL, id TEXT NOT NULL PRIMARY KEY, xp INT NOT NULL )""")
替换字符串拼接SQL为参数化查询
你当前用format拼接SQL的写法有SQL注入风险,也可能因为用户名包含单引号等特殊字符触发语法错误,psycopg2原生支持参数化查询,会自动处理类型转义,不需要手动拼接字符串。修正用户存在性判断逻辑
cursor.execute()的返回值永远不是None,必须调用fetchone()才能拿到查询结果,修正后的完整逻辑:
for guild in bot.guilds: for member in guild.members: if member.id in bots: continue # 参数化查询判断用户是否已存在 cursor.execute("SELECT id FROM users WHERE id = %s", (str(member.id),)) if cursor.fetchone() is None: # 参数化插入数据 cursor.execute( "INSERT INTO users (name, id, xp) VALUES (%s, %s, %s)", (str(member), str(member.id), 0) ) connect.commit() connect.close()
内容的提问来源于stack exchange,提问作者Hallteon
相关产品推荐
相关产品推荐

