分配主键整数范围
Allocate ranges of primary key integers
给定 RangeA 的自动递增主键整数(1 到 32767)和 RangeB(32768 到 2147483647)。如果条件为真,则在 RangeA 中保存一个分配有主键的对象,否则将其保存在 RangeB 中。
管理员(我)将是保存到 RangeA 的唯一用户。如果以上不可能:如果 Django 总是保存在 RangeB 中并且它需要进入 shell 以保存在 RangeA.
中,这将是不理想但仍然可用的
如何使用 Django 和 Postgres 完成此操作?
很有可能。第一件事是更改您的模型,使其不使用标准的 AutoField 作为主键
class MyModel(models.Model):
id = models.IntegerField(primary_key=True)
然后您需要连接到 postgresql 并创建两个不同的序列。
CREATE SEQUENCE small START 1;
CREATE SEQUENCE big START 32768;
除了将其输入到 PSQL 控制台之外,您还可以考虑编辑 django 迁移(使用 RunSQL 指令)来创建这些。
下一步是覆盖保存方法
def save(self,*args, **kwargs)
if not self.id :
cursor = connection.cursor()
if small condition:
cursor.execute("select nextval('small')")
else:
cursor.execute("select nextval('big')")
self.id = cursor.fetchone()[0]
super(MyModel,self).save(*args,**kwargs)
替代保存方法的方法是创建一个 postgresql BEFORE INSERT 触发器。获取 nextval 的往返成本不是很高,但如果这是一个问题,则可以选择创建触发器。在那种情况下,您不需要覆盖保存方法,但您必须在触发器内实现相同的逻辑。
给定 RangeA 的自动递增主键整数(1 到 32767)和 RangeB(32768 到 2147483647)。如果条件为真,则在 RangeA 中保存一个分配有主键的对象,否则将其保存在 RangeB 中。
管理员(我)将是保存到 RangeA 的唯一用户。如果以上不可能:如果 Django 总是保存在 RangeB 中并且它需要进入 shell 以保存在 RangeA.
中,这将是不理想但仍然可用的如何使用 Django 和 Postgres 完成此操作?
很有可能。第一件事是更改您的模型,使其不使用标准的 AutoField 作为主键
class MyModel(models.Model):
id = models.IntegerField(primary_key=True)
然后您需要连接到 postgresql 并创建两个不同的序列。
CREATE SEQUENCE small START 1;
CREATE SEQUENCE big START 32768;
除了将其输入到 PSQL 控制台之外,您还可以考虑编辑 django 迁移(使用 RunSQL 指令)来创建这些。
下一步是覆盖保存方法
def save(self,*args, **kwargs)
if not self.id :
cursor = connection.cursor()
if small condition:
cursor.execute("select nextval('small')")
else:
cursor.execute("select nextval('big')")
self.id = cursor.fetchone()[0]
super(MyModel,self).save(*args,**kwargs)
替代保存方法的方法是创建一个 postgresql BEFORE INSERT 触发器。获取 nextval 的往返成本不是很高,但如果这是一个问题,则可以选择创建触发器。在那种情况下,您不需要覆盖保存方法,但您必须在触发器内实现相同的逻辑。