You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

psycopg2插入数据报integer out of range整数越界错误如何解决

报错根因

Discord生成的用户ID是64位无符号整数,最大值可达18446744073709551615,而PostgreSQL的BIGINT是有符号64位整数,最大仅支持9223372036854775807,当ID超过这个阈值时就会触发数值越界错误,和你拼接SQL的方式也有一定关联。

修复步骤

  1. 调整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
    )""")
  1. 替换字符串拼接SQL为参数化查询
    你当前用format拼接SQL的写法有SQL注入风险,也可能因为用户名包含单引号等特殊字符触发语法错误,psycopg2原生支持参数化查询,会自动处理类型转义,不需要手动拼接字符串。

  2. 修正用户存在性判断逻辑
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:36:06