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

Django中使用generate_series批量插入时如何实现id变量自动递增

解决方案

你的写法逻辑错误在于,Python变量value无法在SQL执行上下文里直接自增,SQL运行时无法操作Python内存中的变量,所以你写的{value} = {value}+1完全不会生效。

你可以直接复用generate_series返回的序列值SEQ,它本身就是从1到10的连续递增整数,直接用预查询得到的最大id加上SEQ就能得到连续递增的新id,符合你每次加1的需求:

from django.db import connection
from django.db.models import Max

max_id = Companies.objects.aggregate(Max('id'))['id__max']
# 兼容表为空的场景,避免max_id为None报错
start_id = max_id if max_id is not None else 0

with connection.cursor() as cursor:
    # 推荐用参数化传值,避免f字符串拼接带来的SQL注入风险
    cursor.execute('''
        INSERT INTO test.companies(
                        id, name, city_id, revenue, labors
                    )
        SELECT  %s + SEQ,
               (
                    SELECT x[1 + ((random() * 25)::INT) % 3]
                    FROM (
                        SELECT '{Google,Yandex,Amazon}'::text[]
                    ) AS z2(x)
                    WHERE SEQ = SEQ
                ),
               (random() * 3000)::INT,
               (random() * 3000)::INT,
               (random() * 3000)::INT

        FROM generate_series(1,10)  SEQ;
    ''', [start_id])

补充注意事项

  • 如果要插入N条数据,只需要修改generate_series(1,N)的第二个参数即可,id会自动从start_id+1递增到start_id+N
  • 高并发场景下需要将查询最大id和插入操作放在同一个事务中,同时对表加写锁,避免其他进程同时插入数据导致主键冲突
  • 不要直接用f字符串拼接SQL参数,使用Django游标自带的参数传递功能可以避免SQL注入风险

内容的提问来源于stack exchange,提问作者GreatGohan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:24:02