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
相关产品推荐
相关产品推荐

