看完这篇博文https://blog . starkandwayne . com/2015/05/23/uuid-primary-keys-in-PostgreSQL/
我想知道更多关于Django是如何生成uuid的,因为我用它们作为我的pk。嗯,根据文档,https://docs.djangoproject.com/es/1.9/ref/models/fields/#uuidfield,Django依赖于PythonUUID模块https://docs.python.org/3/library/uuid.html#uuid.UUID.但是UUID有很多种,我一点也不清楚Django中正在生成哪一种,或者如何选择,假设有选择。
最后,考虑到博客文章中指出的碎片问题,假设uuid_generate_v1mc
在Python或Django中不可用,有没有办法强迫他们使用它?
from django.db.models import Func, UUIDField
class RandomUUID(Func):
template = "uuid_in(md5(random()::text || clock_timestamp()::text)::cstring)"
output_field = UUIDField()
def add_guid(apps, schema_editor):
MyModel= apps.get_model("app", "MyModel")
MyModel.objects.update(guid=lib_models.RandomUUID())
class Migration(migrations.Migration):
...
operations = [
migrations.RunPython(add_guid, reverse_code=migrations.RunPython.noop),
]
> < Li > < p > Django和/或Python如何在Postgresql中生成UUID?
但是有很多种 UUID,我根本不清楚在 Django 中生成了哪一种
当您在Django中使用UUIDfield
作为主键时,它不会为您生成UUID,您在保存对象之前自己生成它
我不知道后来情况是否发生了变化,但上次我使用< code>UUIDField时,您必须自己指定UUID值(例如,当您创建对象时,Django不允许您保存一个带有空白UUID的对象,并让数据库生成一个)。查看Django文档示例强化了我的想法,因为它们提供了一个< code > default = uuid . uuid 4(),例如在主键中。
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
^
|__ calls uuid.uuid4()
要比较不同UUID版本的特性,请参阅以下问题:使用哪个UUID版本?
对于很多应用程序来说,UUID4就足够了
如果您只是想生成一个UUID并继续您的生活,像上面的代码片段这样的< code>uuid.uuid4()就可以了。UUID4是一个随机UUID,发生碰撞的可能性非常小,你真的不需要担心,尤其是如果你每秒钟不会产生大量碰撞的话。
最后,考虑到博客文章中指出的碎片问题,并假设uuid_generate_v1mc
不能直接在Python或Django中使用,是否有办法强制他们使用它?
带有随机MAC地址的Python UUID1,如< code>uuid-ossp的< code>uuid_generate_v1mc
您链接的博客提到了UUID1的使用。Python 的 uuid.uuid1()
采用一个参数来代替默认的实际硬件 MAC 地址(48 位)。由于这些随机位是 UUID1 的末尾,因此 UUID1 的前位可以基于顺序/时间戳来限制索引碎片。
所以呢?
uuid.uuid1(random_48_bits)
应该得到与uuid_generate_v1mc
类似的结果,这是一个具有随机 MAC 地址的 UUID1。
要生成随机48位,作为一个虚拟示例,我们可以使用:
import random
random_48_bits = random.randint(0, 2**48 - 1)
试试看:
>>> import uuid
>>> import random
>>> 2 ** 48 - 1
281474976710655
>>> uuid.uuid1(random.randint(0, 281474976710655))
UUID('c5ecbde1-cbf4-11e5-a759-6096cb89d9a5')
现在用它创建一个函数,并将其用作 Django UUIDField
的默认值
自定义UUIDs,以及来自Instagram的示例
请注意,提出自定义 UUID 方案并使用可用位对可能对应用程序有用的信息进行编码是完全可以的。
E、 g.你可以使用几个比特来编码给定用户的国家,一些比特带有时间戳,一些比特用于随机性等。
您可能想了解Instagram(基于Django和PostgreSQL构建)如何制定自己的UUID方案来帮助分片。
问题内容: 我有一个带有列的表,我需要编写一个查询/函数来生成从列的值到列的值的月份列表。 例如: 将生成以下列表: 我怎么做?我从未使用PostgreSQL生成不存在的数据…它一直在数据库中找到正确的数据…有什么想法可以做到这一点吗?它在查询中可行吗? 问题答案: 您可以使用以下函数生成数据序列: 这会以漂亮的格式为每个月生成一行。如果您希望将其像一个列表,则可以将它们全部合并到一个外部查询中:
问题内容: 我想生成一个日期列表,希望能与另一个表连接,但是我不知道要使用什么语法,类似于以下内容: 我想要日期,因此不必在客户端进一步处理数据。我正在使用它来显示类似于此的表: 问题答案: 日期清单 使用generate_series函数获取可以添加到日期的数字列表,以获取日期列表: 结果: 旋转 问题的后半部分涉及透视结果集- 将行数据转换为列数据。PIVOT和UNPIVOT是ANSI,但我目
问题内容: 在PostgreSQL中,是否可以生成一系列重复数字?例如,我要生成数字1到10,每个数字重复3次: 问题答案: 您可以将其交叉加入一系列3:
问题内容: MySQL的函数返回一个UUIDv1 GUID。我正在寻找一种在SQL中生成随机GUID(即UUIDv4)的简单方法。 问题答案: 我花了很多时间寻找解决方案,并提出了以下mysql函数,该函数使用标准MySQL函数生成一个随机UUID(即UUIDv4)。我正在回答我自己的问题,以期分享它,希望对大家有用。 注意:所使用的伪随机数生成(MySQL’s )在密码上不是安全的,因此存在一些
问题内容: 下面的查询生成一行DNA序列 结果-dna CCCGGTTCTCCCCATGCAGG 我想生成10个随机DNA序列 问题答案: 像这样吗?
我的印象是,UUID规范需要一个有保证的、真实的、全球唯一的结果,不是99.999999999999%的唯一结果,而是100%的唯一结果。从规格来看: UUID为128位长,可以保证跨空间和时间的唯一性。 看起来java只支持UUID规范的V3和V4。V4并不是真正独特的。对于使用< code > namuuidfrombytes 的V3实现,下面的结果是重复的,因为计算机太快了(编辑:循环到10