如何使用 django 1.7.3/postgres 迁移在数据库中设置默认列值?
How to set default column value in the db using django 1.7.3/postgres migrations?
列的默认值似乎只在 ORM 层上,实际上并没有在数据库中设置默认值。同时,例如 ID 密钥在数据库中有一个默认修饰符,这告诉我可以这样做,但不确定如何做?
示例代码:
class Host(models.Model):
name = models.CharField(max_length=255, null=False)
created_at = models.DateTimeField(default=datetime.now, blank=True)
创建以下 table:
Column | Type | Modifiers
------------+--------------------------+-------------------------------------------------------------
id | integer | not null default nextval('myapp_host_id_seq'::regclass)
name | character varying(255) | not null
created_at | timestamp with time zone | not null
有没有办法在 created_at
修饰符中设置迁移 default current_timestamp
?如果没有,有没有办法传入原始 SQL 迁移?我需要它,因为数据库被其他进程(例如批处理进程)使用,我不想在应用程序层上强制执行诸如默认值之类的事情。
这对我有用。我仍然想知道是否有更清洁的解决方案:
class Migration(migrations.Migration):
dependencies = [
('myapp', 'previous_migration'),
]
operations = []
def apply(self, project_state, schema_editor, collect_sql=False):
cursor = connection.cursor()
cursor.execute("alter table myapp_host alter column created_at set default current_timestamp")
return super(Migration, self).apply(project_state, schema_editor, collect_sql)
我会将您的代码放在 RunSQL
operation 中,例如:
class Migration(migrations.Migration):
dependencies = [
('myapp', 'previous_migration'),
]
operations = [
migrations.RunSQL("alter table myapp_host alter column created_at set default current_timestamp"),
]
我认为这种方法比尝试覆盖 apply()
更简洁。 API 使得为反向操作添加 SQL 变得容易,并且由于迁移基础结构理解 RunSQL
的语义,它可能能够做出更好的决策。 (例如,它知道不压缩具有 RunSQL
操作的迁移中的迁移。)
列的默认值似乎只在 ORM 层上,实际上并没有在数据库中设置默认值。同时,例如 ID 密钥在数据库中有一个默认修饰符,这告诉我可以这样做,但不确定如何做?
示例代码:
class Host(models.Model):
name = models.CharField(max_length=255, null=False)
created_at = models.DateTimeField(default=datetime.now, blank=True)
创建以下 table:
Column | Type | Modifiers
------------+--------------------------+-------------------------------------------------------------
id | integer | not null default nextval('myapp_host_id_seq'::regclass)
name | character varying(255) | not null
created_at | timestamp with time zone | not null
有没有办法在 created_at
修饰符中设置迁移 default current_timestamp
?如果没有,有没有办法传入原始 SQL 迁移?我需要它,因为数据库被其他进程(例如批处理进程)使用,我不想在应用程序层上强制执行诸如默认值之类的事情。
这对我有用。我仍然想知道是否有更清洁的解决方案:
class Migration(migrations.Migration):
dependencies = [
('myapp', 'previous_migration'),
]
operations = []
def apply(self, project_state, schema_editor, collect_sql=False):
cursor = connection.cursor()
cursor.execute("alter table myapp_host alter column created_at set default current_timestamp")
return super(Migration, self).apply(project_state, schema_editor, collect_sql)
我会将您的代码放在 RunSQL
operation 中,例如:
class Migration(migrations.Migration):
dependencies = [
('myapp', 'previous_migration'),
]
operations = [
migrations.RunSQL("alter table myapp_host alter column created_at set default current_timestamp"),
]
我认为这种方法比尝试覆盖 apply()
更简洁。 API 使得为反向操作添加 SQL 变得容易,并且由于迁移基础结构理解 RunSQL
的语义,它可能能够做出更好的决策。 (例如,它知道不压缩具有 RunSQL
操作的迁移中的迁移。)