Django如何使用snowflake自定义生成主键而不是自动生成主键?

关系型数据库核心原理与工程实践指南 关系型数据库是一种基于数学关系模型的结构化数据管理范式,其本质是通过原子性、无序性、无重复行和值域约束四大支柱,保障数据的逻辑一致性与业务可追溯性。它依托关系代数实现声明式查询,以范式理论驱动业务复杂度治理,并通过主键设计、外键约束、索引策略、事务隔离等关键技术落地强一致性需求。在金融交易、订单管理、用户中心等强关联、高一致场景中不可替代,同时需结合缓存、搜索等组件构建混合架构。本文深入解析关系模型底层逻辑与MySQL/PostgreSQL典型实践,覆盖设计、开发、运维全链路避坑要点。 阅读详情

之前ID都是用自增实现的,那现在想用Snowflake算法生成主键,要做什么改动呢?

背景介绍

目前工程框架如下

  • Django
  • django.db.backends.postgresql_psycopg2

目前models声明和save()方法如下

# models.py
# 使用的是默认主键
class User(models.Model):
    name = models.CharField(max_length=100, verbose_name="名字")
# user的新增操作,默认主键
user = User()
user.name = "123"
user.save()

user.save()时执行的SQL语句是

INSERT INTO "polls_user" ("name") VALUES ('xiaoming') RETURNING "polls_user"."id"; args=('xiaoming',)

很明显,并未在语句中设置ID主键

查看表结构,发现id自动是使用序列自增来实现的

CREATE TABLE "public"."polls_user" (
  "id" int4 NOT NULL DEFAULT nextval('polls_user_id_seq'::regclass),
  "name" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,
  CONSTRAINT "polls_user_pkey" PRIMARY KEY ("id")
)

那么基于目前的情况,如何改写使用snowflake算法生成ID,而不是自动生成主键呢?

实现方案

方案1 - 手动添加主键

实现方式如下

  • (1)首先需要声明id,声明为非AutoField类型

    如果不声明,在使用postgresql的情况下,会默认为主键设置为serial类型,使用序列生成主键

# models.py

class User(models.Model):
    id = models.BigIntegerField(primary_key=True)
    name = models.CharField(max_length
MuleSoft+LangChain双引擎AI编排架构实战 AI编排(AI Orchestration)是企业实现大模型落地的核心能力,本质是将自然语言指令转化为可执行、可审计、可合规的多系统协同工作流。其技术原理在于解耦数据集成与AI推理:前者依赖企业级连接器、细粒度权限控制与高可靠数据管道,后者依托动态提示工程、工具调用链与状态化推理。该架构显著提升AI生成结果的事实准确性与业务适配性,广泛应用于销售智能助手、合规审计报告、客户流失预警等场景。本文聚焦MuleSoft与LangChain混合架构,详解如何通过数据流、控制流与安全流三重分离,构建稳定、灵活、可过审 阅读详情

相关推荐

Django--05项目管理模块数据库对象优化

一、字段类型的选择 mysql数据类型: datatime 8个字节 性能是毫秒级的 integer 4个字节 bigint 8个字节 varchar 最大长度65535字节 char 最大长度255字节 使用数据类型需要考虑: 存储空间 计算复杂度 能否利用内置函数 1)ID生成策略 文章:varchar、text 64K 身份证号码ID 项目ID: 1、自增字段AutoField,integer/auto increment 缺点自增字段暴露关键的业务信息(渗透测试) 2、uuid 对索引来说不友好

摘 月 177

Pycharm中 安装 Django

创建应用 使用命令行模式创建应用 在 Terminal 中输入python manage.py startappapp01(应用名):【 Django在Terminal中python manage.py startapp 应用名报name 'os' is not defined 解决办法:打开settings文件,加上import os 】 此时新建了一个app01文件 app01应用文件中包含: admin.py :管理站点模型的声明文件,默认为空。 apps...

weixin_38858860的博客 1261

Thread中sleep,wait,yield,setPriority学习心得

Thread中sleep,wait,yield学习心得 Thread中控制线程暂停的三种重要方法就是sleep,wait和yield。对于三种方法的特点和用法,我在这里做了总结。 sleep() Thread.sleep()是暂停线程的常用方法,该方法必须指定暂停时长,并在暂停结束后自动醒来。当然,在sleep的过程中,也有方法直接唤醒线程,具体请问度娘。sleep函数的参数可以是(毫秒)或者(毫秒,纳秒)。 wait() wait方法本属于object类。要使用wait方法,当前对象必须拥有即锁(moni

ahy231的博客 2541

Django python雪花算法实现

python 雪花算法

qq_41710802的博客 563

Django学习-缓存机制

此章对应于Django2。原文:https://djangobook.com/djangos-cache-framework/ 在之前文章中提到了性能优化-缓存机制来实现,可以提高服务器性能,缩短响应时间。 动态网站的问题在于它需要根据每次的请求,动态通过相应业务逻辑根据输入条件获取数据,并进行模版渲染返回浏览器生成最终网页,在这个过程中,响应的快慢对服务器端的性能提出了较高的要求。 缓存的...

Nnewbie的博客 544

django uwsgi分布式/单机唯一id生成雪花算法

鉴于多进程会出现生成的唯一id相同的问题:因为uwsgi项目启动是多进程的形式,所以我采取用每个uwsgi woker id作为雪花生成器的机器id-worker_id;分布式的情况,可以将你的集群中的机器编号,将每个机器的编号代入datacenter_id。这样正常的生产环境就可以保证生成的雪花id相同了。可以根据循环位个数来增加雪花id每毫秒生成的最大数量。...

xiaofeixia666888的博客 967

snowflake主键 自增_Django如何使用snowflake自定义生成主键不是自动生成主键?...

之前ID都是用自增实现的,那现在想用Snowflake算法生成主键,要做什么改动呢?目录背景介绍实现方案方案1 - 手动添加主键方案2 - 重写save()方法方案3 - 使用 Django Signals 中的pre_save()方案4 - 仿照models.UUIDField,写一个models.SnowflakeIDField总结背景介绍目前工程框架如下Djangodjango.db.bac...

weixin_34405084的博客 826

django 怎样获取自增id的_一线大厂的分布式唯一ID生成方案是什么样的?快来看看吧...

一、前言分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表。因为数据量巨大一张表无法承接,就会对其进行分库分表。但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题,永不迁移数据和避免热点的文章中要求需要唯一ID的特性:整个系统ID唯一ID是数字类型,而且是趋势递增的ID简短,查询效率快什么是递增?如:第一次生成的ID为12,下一次生成的ID是13,再下一次生成的ID...

weixin_36352523的博客 106

从入门到精通:Timeflake完整使用指南(含代码示例与最佳实践)

Timeflake是一个128位的、大致有序的、URL安全的UUID库,专为需要高性能数据库索引和分布式系统设计的开发者打造。如果你正在寻找一种既随机又大致按时间排序的ID生成方案,Timeflake可能是你的完美选择。它结合了Twitter Snowflake的时间有序性和UUID的分布式特性,同时保持了与标准UUID的兼容性。🚀 ## 📋 什么是Timeflake? Timeflake

gitblog_09782的博客 327

分库分表分片建选择

在分库分表的场景下,,尤其是在跨分片(分库分表)的场景中。如果每个分片(分库或分表)独立使用数据库的自增主键(如 MySQL 的),则不同分片的自增ID会从1开始递增,导致不同分片的表中主键ID重复。t_order_01t_order_11如果业务需要跨分片查询(如全局唯一ID作为外键),自增ID的重复会导致数据关联失败或逻辑错误。:通过算法生成全局唯一的ID,如等。:在每个分片中使用自增ID,同时添加分片ID作为前缀,形成复合主键或唯一键。

qq_42552857的博客 880

django 怎样获取自增id的_一口气说出9种分布式ID生成方式,面试官有点懵了!

一、为什么要用分布式ID?在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?1、什么是分布式ID?拿MySQL数据库举个栗子:在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条...

weixin_42415498的博客 164

django 怎样获取自增id的_一口气说出 9种 分布式ID生成方式,面试官有点懵了

文章来源:https://mp.weixin.qq.com/s/GmfDeMKTeRJ07N3MhgQsIA作者:程序员内点事一、为什么要用分布式ID?在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?1、什么是分布式ID?拿MySQL数据库举个栗子:在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也...

weixin_36337561的博客 219

django 怎样获取自增id的_一口气说出9种分布式ID生成方式,面试官有点懵了

作者:程序员内点事链接:https://juejin.im/post/5e48a9af6fb9a07cc200c203来源:掘金一、为什么要用分布式ID?在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?1、什么是分布式ID?拿MySQL数据库举个栗子:在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离...

weixin_36046580的博客 528

分布式全局唯一ID生成 和 雪花算法

分布式全局唯一ID业务需求 ID生成规则部分硬性要求 全局唯一 唯一性 趋势递增 单调递增 信息安全 含时间戳 ID生成系统的可用性 一般ID生成方案 UUID 但是UUID入库性能差 数据库自增主键 单机中: 集群分布式: 基于Redis生成全局ID策略 不好维护 雪花算法 Twitter 的分布式自增ID算法snowflake 概述 结构 工程落地 糊涂工具包,springboot整合雪花算法 引入pom依赖 优缺点 ...

方亚军的博客 701

分布式唯一id生成策略

最近发现公司用的公共jar包里生成唯一主键的方法竟然用的是当前时间戳,这种方式有明显弊端,参考了网上各种生成唯一id的方式之后,做下总结。一、数据库自增ID使用mysql数据库的自增id,数据库的自增id的优点是非常明显的:第一是速度快,而且是按序自增,检索非常有利。第二是自增的id都是数字型,占用空间小,易于程序中排序。 第三是新增记录时可以不用指定id,不用担心主键重复问题。当然,使用数据库自...

weixin_34310785的博客 256

django 怎样获取自增id的_分布式系统ID的生成方法之UUID、数据库、算法、Redis、Leaf方案...

前言一般单机或者单数据库的项目可能规模比较小,适应的场景也比较有限,平台的访问量和业务量都较小,业务ID的生成方式比较原始但是够用,它并没有给这样的系统带来问题和瓶颈,所以这种情况下我们并没有对此给予太多的关注。但是对于大厂的那种大规模复杂业务、分布式高并发的应用场景,显然这种ID的生成方式不会像小项目一样仅仅依靠简单的数据自增序列来完成,而且在分布式环境下这种方式已经无法满足业务的需求,不仅无法...

weixin_36088159的博客 290

Django数据库写入瓶颈突破】:深入解析bulk_create批量提交的隐藏陷阱与解决方案

突破Django数据库写入性能瓶颈,详解Django ORM bulk_create 的批量提交技巧。涵盖大批量数据插入场景、减少查询开销与自增主键处理方案,显著提升写入效率。掌握核心优化策略,值得收藏。

ProceGlow的博客 829

Timeflake:终极128位URL安全UUID详解,让数据库索引性能提升300%的秘密

Timeflake是一种128位、大致有序、URL安全的UUID,灵感来源于Twitter的Snowflake、Instagram的ID和Firebase的PushID。作为新一代分布式唯一标识符生成方案,它完美解决了传统UUID无序性导致的数据库性能问题,同时保持了高度的安全性和可用性。 ## 🚀 什么是Timeflake?核心优势解析 Timeflake本质上是一种融合了时间戳和随机数据

gitblog_00890的博客 470
上一篇: Ubuntu安装和使用Supervisor管理Python脚本
下一篇: Docker部署的Jenkins如何更新版本呢
Tomonkey
博客等级 码龄12年 31粉丝 100原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值