iba棋牌博彩平台注册送体验金_Sentry 拓荒者孝顺指南-数据库转移
6868体育
Django 转移是咱们经管 Sentry 中数据库转变的神志。
皇冠客服飞机:@seo3687
皇冠博彩Django 转移官方文档:https://docs.djangoproject.com/en/2.2/topics/migrations/。
iba棋牌这些将涵盖了解转移正在实行的操作所需的大部天职容。
赛马 号召请提神,关于统统这些号召,如若在 getsentry 存储库中,您不错将 getsentry 替换为 sentry。
将您的数据库升级到最新sentry upgrade 会自动更新你的转移。您也不错运行 sentry django migrate 来奏凯捕快转移号召。
将您的数据库转移到特定的转移
当您要测试迁倏得,这会很有匡助。
sentry django migrate - 请提神,migration_name 不错是部分匹配,持续数字便是你所需要的。
举例:sentry django migrate sentry 0005
这也可用于回滚转移。如若你犯了差错,在拓荒中很有用。
新2网址足球手机版1为转移生成 SQL
这对审查您的代码的东说念主很有匡助,因为并不老是明晰 Django 转移本色要作念什么。
sentry django sqlmigrate
举例 sentry django sqlmigrate sentry 0003
生成转移这会字据您对模子所作念的转变自动为您生成转移。
皇冠和开云体育哪个好一点sentry django makemigrations
或者
sentry django makemigrations 用于一个指定的 app。
举例 sentry django makemigrations sentry
当您在 pr 中包含迁倏得,还要为转移生成 sql 并将其看成珍视包含在内,以便您的审阅者不错更搪塞地了解 Django 正在作念什么。
皇冠体育hg86a
您还不错使用 sentry django makemigrations --empty 生成空转移。这关于数据转移和其他自界说职责很有用。
将转移归拢到 master归拢到 master 时,您可能会提神到与 migrations_lockfile.txt 的突破。这个文献是为了匡助咱们幸免将具有筹商转移编号的两个转移归拢到 master,如若您与它发生突破,那么很可能有东说念主在您之前提交了转移。
指南在运行迁倏得,咱们需要提神一些事项。
过滤器如若(数据)转移触及大表或未索引的列,最佳迭代统统这个词表而不是使用 filter。举例:
EnvironmentProject.objects.filter(environment__name="none") 6868体育
因为 EnvironmentProject 行太多,这会一次将太多行带入内存。违反,咱们应该使用 RangeQuerySetWrapperWithProgressBar 遍历统统 EnvironmentProject 行,因为它会分块进行。举例:
for env in RangeQuerySetWrapperWithProgressBar(EnvironmentProject.objects.all()): if env.name == 'none': # Do what you need
咱们持续更心爱幸免将 .filter 与 RangeQuerySetWrapperWithProgressBar 沿途使用。由于它仍是通过 id 对表进行排序,因此咱们无法愚弄字段上的任何索引,况兼可能会为每个块扫描大批行。这会运行得更慢,但咱们持续更心爱这么,因为它在更长的技术内平均负载,并使每个查询获得每个块的本钱特地低。
索引咱们更心爱使用 CREATE INDEX CONCURRENTLY 在现存的大型表上创建索引。当咱们这么作念时,咱们无法在事务中运行转移,因此使用 atomic = False 来运行这些很紧迫。
删除列/表由于咱们的部署历程,这很复杂。当咱们部署时,咱们运行转移,然后推出应用范例代码,这需要一段技术。这意味着如若咱们仅仅删除一个列或模子,那么 sentry 中的代码将查找这些列/表并在部署完成之前出错。在某些情况下,这可能意味着 Sentry 在部署完成之前很难停机。
为幸免这种情况,请实行以下要道:
列 如若列不是空的,则将其标志为空,并创建一个转移。 部署。 从模子中删除列,但在转移中确保咱们只将景况标志为已删除(removed)。 部署。 临了,创建一个删除列的转移。这是删除仍是不错为空的列的示例。率先咱们从模子中删除列,然后修改转移以仅更新景况而不进行数据库操作。
operations = [ migrations.SeparateDatabaseAndState( database_operations=[], state_operations=[ migrations.RemoveField(model_name="alertrule", name="alert_threshold"), migrations.RemoveField(model_name="alertrule", name="resolve_threshold"), migrations.RemoveField(model_name="alertrule", name="threshold_type"), ], ) ]
一朝部署完成,咱们就不错部署本色的列删除。这个 pr 只会有一个转移,因为 Django 不再知说念这些字段。请提神,反向 SQL 仅适用于拓荒东说念主员,因此不错不分派默许值或进行任何类型的回填:
operations = [ migrations.SeparateDatabaseAndState( database_operations=[ migrations.RunSQL( """ ALTER TABLE "sentry_alertrule" DROP COLUMN "alert_threshold"; ALTER TABLE "sentry_alertrule" DROP COLUMN "resolve_threshold"; ALTER TABLE "sentry_alertrule" DROP COLUMN "threshold_type"; """, reverse_sql=""" ALTER TABLE "sentry_alertrule" ADD COLUMN "alert_threshold" smallint NULL; ALTER TABLE "sentry_alertrule" ADD COLUMN "resolve_threshold" int NULL; ALTER TABLE "sentry_alertrule" ADD COLUMN "threshold_type" int NULL; """, ) ], state_operations=[], ) ]表
如若该表在其他表中被援用为外键,则需要格外提神。在这种情况下,率先删除其他表中的外键列,然后复返到此要道。
通过在列上诞生 db_constraint=False,删除此表到其他表的任何数据库级外键不停。 部署 从 sentry 代码库中删除模子和统统援用。确保转移仅将景况标志为已删除。 部署。 创建一个删除表的转移。 部署这是删除此模子的示例:
赖潭——1:1复刻茅台工艺、口感10分似飞天
1、飞天茅台白酒界当之无愧的NO.1,酱香标杆,品质和口碑无可挑剔。价格昂贵,一瓶难求。2、五粮液浓香界的扛把子,精选5种粮食,高温培养“包包曲”酿造,喷香浓郁,各味协调。3、赖圣坊产自贵州,与茅台渊源颇深,口感和茅台十分相似。所选用的原料、水源和工艺都是茅台八仙的冯小宁一比一复刻茅台的。10年基酒,同时再加上25年以上老酒,酿造出的白酒酱香十分浓郁,入口柔和。价格也很接地气,被称为“小飞天”。4、汾酒青花30俗话说“浓香的尽头是清香”,此酒经汾酒特色勾兑技术勾调,清香纯正,幽雅芳香。5、国窖1573单粮酒天花板,由我国第一窖池酿制,粮食香气比较重,整体清冽甘甜,口感在白酒里算是比较柔和的。6.红西凤西凤酒中的高端酒,大曲发酵,欧博代理开户是比较优雅的凤香,口感绵柔。
class AlertRuleTriggerAction(Model): alert_rule_trigger = FlexibleForeignKey("sentry.AlertRuleTrigger") integration = FlexibleForeignKey("sentry.Integration", null=True) type = models.SmallIntegerField() target_type = models.SmallIntegerField() # Identifier used to perform the action on a given target target_identifier = models.TextField(null=True) # Human readable name to display in the UI target_display = models.TextField(null=True) date_added = models.DateTimeField(default=timezone.now) class Meta: app_label = "sentry" db_table = "sentry_alertruletriggeraction"
率先,咱们查验了它莫得被任何其他模子援用,它莫得。接下来,咱们需要删除和 db 级外键不停。为此,咱们改变这两列并生成一个转移:
alert_rule_trigger = FlexibleForeignKey("sentry.AlertRuleTrigger", db_constraint=False) integration = FlexibleForeignKey("sentry.Integration", null=True, db_constraint=False)
转移中的操作看起来像

operations = [ migrations.AlterField( model_name='alertruletriggeraction', name='alert_rule_trigger', field=sentry.db.models.fields.foreignkey.FlexibleForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADE, to='sentry.AlertRuleTrigger'), ), migrations.AlterField( model_name='alertruletriggeraction', name='integration', field=sentry.db.models.fields.foreignkey.FlexibleForeignKey(db_constraint=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='sentry.Integration'), ), ]
咱们不错看到它生成的 sql 仅仅删除了 FK 不停
BEGIN; SET CONSTRAINTS "a875987ae7debe6be88869cb2eebcdc5" IMMEDIATE; ALTER TABLE "sentry_alertruletriggeraction" DROP CONSTRAINT "a875987ae7debe6be88869cb2eebcdc5"; SET CONSTRAINTS "sentry_integration_id_14286d876e86361c_fk_sentry_integration_id" IMMEDIATE; ALTER TABLE "sentry_alertruletriggeraction" DROP CONSTRAINT "sentry_integration_id_14286d876e86361c_fk_sentry_integration_id"; COMMIT;
是以当今咱们部署它并插把握一阶段。
下一阶段触及从代码库中删除对模子的统统援用。是以咱们这么作念,然后咱们生成一个转移,从转移景况中删除模子,而不是数据库。此转移中的操作如下所示
一场疑似被操纵的体育比赛在皇冠体育上引起了轩然大波,吸引了大量赌徒参与赌博,最终受害者不计其数。operations = [ migrations.SeparateDatabaseAndState( state_operations=[migrations.DeleteModel(name="AlertRuleTriggerAction")], database_operations=[], ) ]
况兼生成的 SQL 显现莫得发生数据库转变。是以当今咱们部署它并插足临了一步。
在这临了一步中,咱们只念念手动编写 DDL 来删除表。是以咱们使用 sentry django makemigrations --empty 来产生一个空的转移,然后修改操作如下:
operations = [ migrations.RunSQL( """ DROP TABLE "sentry_alertruletriggeraction"; """, reverse_sql="CREATE TABLE sentry_alertruletriggeraction (fake_col int)", # We just create a fake table here so that the DROP will work if we roll back the migration. ) ]
然后咱们部署它,咱们就完成了。
外键创建外键大多没问题,可是关于像 Project、Group 这么的大/用功的表,由于获得锁的难题,它可能会导致问题。您仍然不错创建 Django 级别的外键,而无需创建数据库不停。为此,请在界说键时诞生 db_constraint=False。
重定名表重定名表很危急,会导致停机。发生这种情况的原因是在部署技术将运行旧/新代码的搀杂。因此,一朝咱们在 Postgres 中重定名该表,如若旧代码尝试捕快它,它就会立即运行出错。有两种门径不错经管重定名表:
不要在 Postgres 中重定名表。违反,只需在 Django 中重定名模子,并确保将 Meta.db_table 诞生为面前表名,这么不会有任何中断。这是首选门径。 如若你确切念念重定名表,那么要道将是: 使用新称号创建一个表 运行对旧表和新表进行双重写入,最佳是在事务中。 将旧行回填到新表中。 将 model 转变为从头表运行读取。 罢手写入旧表并从代码中删除援用。 丢弃旧表。 一般来说,这是不值得作念的,与答谢比较,这需要冒许多风险/付出许多悉力。 添加列创建新列时,它们应永久创建为可为空的。这是出于两个原因:
如若存在现存行,添加非空列需要诞生默许值,添加默许值需要全齐重写表。这是危急的,很可能会导致停机 在部署技术,新旧代码搀杂运行。如若旧代码尝试向表中插入一瞥,则插入将失败,因为旧代码不知说念新列存在,因此无法为该列提供值。 向列添加 NOT NULL将 not null 添加到列可能很危急,即使该列的表的每一瞥齐独特据。这是因为 Postgres 仍然需要对统统行实行非空查验,然后智商添加不停。在小表上这可能没问题,因为查验会很快,但在大表上这可能会导致停机。这里有几个选项不错确保安全:
ALTER TABLE tbl ADD CONSTRAINT cnstr CHECK (col IS NOT NULL) NOT VALID; ALTER TABLE tbl VALIDATE CONSTRAINT cnstr;. 率先,咱们将不停创建为无效。然后咱们之后考据它。咱们仍然需要扫描统统这个词表来考据,但咱们只需要合手有一个 SHARE UPDATE EXCLUSIVE 锁,它只会间隔其他 ALTER TABLE 号召,但允许读/写不绝。这很有用,但会有 0.5-1% 的细小性能赔本。在 Postgres 12 之后,咱们不错膨胀这个门径来添加一个的确的 NOT NULL 不停。 如若表充足小况兼体积充足小,那么创建一个芜俚的 NOT NULL 不停应该是安全的。小是几百万行或更少。 添加具有默许值的列向现存表添加具有默许值的列是危急的。这需要 Postgres 锁定表并重写它。违反,更好的罗致是:
ug环球百家乐在 Postgres 中添加莫得默许值的列,但在 Django 中添加默许值。这使咱们大要确保统统新行齐具有默许值。这是通过修改转移文献以包含 migrations.SeperateDatabaseAndState 来完成的
operations = [ migrations.SeparateDatabaseAndState( database_operations=[ migrations.AddField( model_name="mymodel", name="new_field", # Don't use a default in Postgres, a data migration can be used afterward to backfill field=models.PositiveSmallIntegerField(null=True), ), ], state_operations=[ migrations.AddField( model_name="mymodel", name="new_field", # Use the default in Django, new rows will use the specified default field=models.PositiveSmallIntegerField(null=True, default=1), ), ], ) ]通过数据转移使用默许值回填事先存在的行。 改变列类型
改变列的类型持续是危急的,因为它需要重写统统这个词表。有一些例外:
将 varchar() 转变为更大尺寸的 varchar。 将任何 varchar 转变为 text 将 numeric 转变为 numeric,其中 precision 更高但 scale 筹商。关于任何其他类型,最佳的前进旅途持续是:
创建具有新类型的列。 运行对新旧列进行双重写入。 回填并将旧列值转机为新列。 转变代码以使用新字段。 罢手写入旧列并从代码中删除援用。 从数据库中删除旧列。 持续,这值得在 #discuss-backend 上钩议。 重定名列重定名列是危急的,会导致停机。发生这种情况的原因是在部署技术将运行旧/新代码的搀杂。因此,一朝咱们在 Postgres 中重定名该列,如若旧代码尝试捕快它,它就会立即运行出错。有两种门径不错经管重定名列:
不要重定名 Postgres 中的列。违反,只需在 Django 中重定名字段,并在界说中使用 db_column 将其诞生为现存的列名,这么就不会中断。这是首选门径。 如若你确切念念重定名列,那么要道将是: 创建具有新称号的列 运行对新旧列进行双重写入。 将旧列值回填到新列中。 将字段转变为从头列运行读取。 罢手写入旧列并从代码中删除援用。 从数据库中删除旧列。一般来说,这是不值得作念的,与答谢比较,这需要冒许多风险/付出许多悉力。