精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Sentry 開發(fā)者貢獻(xiàn)指南-數(shù)據(jù)庫遷移

運(yùn)維 數(shù)據(jù)庫運(yùn)維
重命名列是危險(xiǎn)的,會導(dǎo)致停機(jī)。發(fā)生這種情況的原因是在部署期間將運(yùn)行舊/新代碼的混合。因此,一旦我們在 Postgres 中重命名該列,如果舊代碼嘗試訪問它,它就會立即開始出錯(cuò)。

Django 遷移是我們處理 Sentry 中數(shù)據(jù)庫更改的方式。

Django 遷移官方文檔:https://docs.djangoproject.com/en/2.2/topics/migrations/。

這些將涵蓋了解遷移正在執(zhí)行的操作所需的大部分內(nèi)容。

命令

請注意,對于所有這些命令,如果在 getsentry 存儲庫中,您可以將 getsentry 替換為 sentry。

將您的數(shù)據(jù)庫升級到最新

sentry upgrade 會自動(dòng)更新你的遷移。您也可以運(yùn)行 sentry django migrate 來直接訪問遷移命令。

將您的數(shù)據(jù)庫移動(dòng)到特定的遷移

當(dāng)您要測試遷移時(shí),這會很有幫助。

sentry django migrate - 請注意,migration_name 可以是部分匹配,通常數(shù)字就是你所需要的。

例如:sentry django migrate sentry 0005

這也可用于回滾遷移。如果你犯了錯(cuò)誤,在開發(fā)中很有用。

為遷移生成 SQL

這對審查您的代碼的人很有幫助,因?yàn)椴⒉豢偸乔宄?Django 遷移實(shí)際要做什么。

sentry django sqlmigrate

例如 sentry django sqlmigrate sentry 0003

生成遷移

這會根據(jù)您對模型所做的更改自動(dòng)為您生成遷移。

sentry django makemigrations

或者

sentry django makemigrations 用于一個(gè)指定的 app。

例如 sentry django makemigrations sentry

當(dāng)您在 pr 中包含遷移時(shí),還要為遷移生成 sql 并將其作為注釋包含在內(nèi),以便您的審閱者可以更輕松地了解 Django 正在做什么。

您還可以使用 sentry django makemigrations --empty 生成空遷移。這對于數(shù)據(jù)遷移和其他自定義工作很有用。

將遷移合并到 master

合并到 master 時(shí),您可能會注意到與 migrations_lockfile.txt 的沖突。這個(gè)文件是為了幫助我們避免將具有相同遷移編號的兩個(gè)遷移合并到 master,如果您與它發(fā)生沖突,那么很可能有人在您之前提交了遷移。

指南

在運(yùn)行遷移時(shí),我們需要注意一些事項(xiàng)。

過濾器

如果(數(shù)據(jù))遷移涉及大表或未索引的列,最好迭代整個(gè)表而不是使用 filter。例如:

  1. EnvironmentProject.objects.filter(environment__name="none"

因?yàn)?EnvironmentProject 行太多,這會一次將太多行帶入內(nèi)存。相反,我們應(yīng)該使用 RangeQuerySetWrapperWithProgressBar 遍歷所有 EnvironmentProject 行,因?yàn)樗鼤謮K進(jìn)行。例如:

  1. for env in RangeQuerySetWrapperWithProgressBar(EnvironmentProject.objects.all()): 
  2.     if env.name == 'none'
  3.         # Do what you need 

我們通常更喜歡避免將 .filter 與 RangeQuerySetWrapperWithProgressBar 一起使用。由于它已經(jīng)通過 id 對表進(jìn)行排序,因此我們無法利用字段上的任何索引,并且可能會為每個(gè)塊掃描大量行。這會運(yùn)行得更慢,但我們通常更喜歡這樣,因?yàn)樗诟L的時(shí)間內(nèi)平均負(fù)載,并使每個(gè)查詢獲取每個(gè)塊的成本相當(dāng)?shù)汀?/p>

索引

我們更喜歡使用 CREATE INDEX CONCURRENTLY 在現(xiàn)有的大型表上創(chuàng)建索引。當(dāng)我們這樣做時(shí),我們無法在事務(wù)中運(yùn)行遷移,因此使用 atomic = False 來運(yùn)行這些很重要。

刪除列/表

由于我們的部署過程,這很復(fù)雜。當(dāng)我們部署時(shí),我們運(yùn)行遷移,然后推出應(yīng)用程序代碼,這需要一段時(shí)間。這意味著如果我們只是刪除一個(gè)列或模型,那么 sentry 中的代碼將查找這些列/表并在部署完成之前出錯(cuò)。在某些情況下,這可能意味著 Sentry 在部署完成之前很難停機(jī)。

為避免這種情況,請執(zhí)行以下步驟:

  • 如果列不是空的,則將其標(biāo)記為空,并創(chuàng)建一個(gè)遷移。
  • 部署。
  • 從模型中刪除列,但在遷移中確保我們只將狀態(tài)標(biāo)記為已刪除(removed)。
  • 部署。
  • 最后,創(chuàng)建一個(gè)刪除列的遷移。

這是刪除已經(jīng)可以為空的列的示例。首先我們從模型中刪除列,然后修改遷移以僅更新狀態(tài)而不進(jìn)行數(shù)據(jù)庫操作。

  1. operations = [ 
  2.         migrations.SeparateDatabaseAndState( 
  3.             database_operations=[], 
  4.             state_operations=[ 
  5.                 migrations.RemoveField(model_name="alertrule"name="alert_threshold"), 
  6.                 migrations.RemoveField(model_name="alertrule"name="resolve_threshold"), 
  7.                 migrations.RemoveField(model_name="alertrule"name="threshold_type"), 
  8.             ], 
  9.         ) 
  10.     ] 

一旦部署完成,我們就可以部署實(shí)際的列刪除。這個(gè) pr 只會有一個(gè)遷移,因?yàn)?Django 不再知道這些字段。請注意,反向 SQL 僅適用于開發(fā)人員,因此可以不分配默認(rèn)值或進(jìn)行任何類型的回填:

  1. operations = [ 
  2.         migrations.SeparateDatabaseAndState( 
  3.             database_operations=[ 
  4.                 migrations.RunSQL( 
  5.                     ""
  6.                     ALTER TABLE "sentry_alertrule" DROP COLUMN "alert_threshold"
  7.                     ALTER TABLE "sentry_alertrule" DROP COLUMN "resolve_threshold"
  8.                     ALTER TABLE "sentry_alertrule" DROP COLUMN "threshold_type"
  9.                     """, 
  10.                     reverse_sql=""
  11.                     ALTER TABLE "sentry_alertrule" ADD COLUMN "alert_threshold" smallint NULL
  12.                     ALTER TABLE "sentry_alertrule" ADD COLUMN "resolve_threshold" int NULL
  13.                     ALTER TABLE "sentry_alertrule" ADD COLUMN "threshold_type" int NULL
  14.  
  15.                     """, 
  16.                 ) 
  17.             ], 
  18.             state_operations=[], 
  19.         ) 
  20.     ] 

如果該表在其他表中被引用為外鍵,則需要格外小心。在這種情況下,首先刪除其他表中的外鍵列,然后返回到此步驟。

  • 通過在列上設(shè)置 db_constraint=False,刪除此表到其他表的任何數(shù)據(jù)庫級外鍵約束。
  • 部署
  • 從 sentry 代碼庫中刪除模型和所有引用。確保遷移僅將狀態(tài)標(biāo)記為已刪除。
  • 部署。
  • 創(chuàng)建一個(gè)刪除表的遷移。
  • 部署

這是刪除此模型的示例:

  1. class AlertRuleTriggerAction(Model): 
  2.     alert_rule_trigger = FlexibleForeignKey("sentry.AlertRuleTrigger"
  3.     integration = FlexibleForeignKey("sentry.Integration"null=True
  4.     type = models.SmallIntegerField() 
  5.     target_type = models.SmallIntegerField() 
  6.     # Identifier used to perform the action on a given target 
  7.     target_identifier = models.TextField(null=True
  8.     # Human readable name to display in the UI 
  9.     target_display = models.TextField(null=True
  10.     date_added = models.DateTimeField(default=timezone.now) 
  11.  
  12.     class Meta: 
  13.         app_label = "sentry" 
  14.         db_table = "sentry_alertruletriggeraction" 

首先,我們檢查了它沒有被任何其他模型引用,它沒有。接下來,我們需要?jiǎng)h除和 db 級外鍵約束。為此,我們改變這兩列并生成一個(gè)遷移:

  1. alert_rule_trigger = FlexibleForeignKey("sentry.AlertRuleTrigger", db_constraint=False
  2. integration = FlexibleForeignKey("sentry.Integration"null=True, db_constraint=False

遷移中的操作看起來像

  1. operations = [ 
  2.        migrations.AlterField( 
  3.            model_name='alertruletriggeraction'
  4.            name='alert_rule_trigger'
  5.            field=sentry.db.models.fields.foreignkey.FlexibleForeignKey(db_constraint=False, on_delete=django.db.models.deletion.CASCADEto='sentry.AlertRuleTrigger'), 
  6.        ), 
  7.        migrations.AlterField( 
  8.            model_name='alertruletriggeraction'
  9.            name='integration'
  10.            field=sentry.db.models.fields.foreignkey.FlexibleForeignKey(db_constraint=Falsenull=True, on_delete=django.db.models.deletion.CASCADEto='sentry.Integration'), 
  11.        ), 
  12.    ] 

我們可以看到它生成的 sql 只是刪除了 FK 約束

  1. BEGIN
  2. SET CONSTRAINTS "a875987ae7debe6be88869cb2eebcdc5" IMMEDIATE; ALTER TABLE "sentry_alertruletriggeraction" DROP CONSTRAINT "a875987ae7debe6be88869cb2eebcdc5"
  3. 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"
  4. COMMIT

所以現(xiàn)在我們部署它并進(jìn)入下一階段。

下一階段涉及從代碼庫中刪除對模型的所有引用。所以我們這樣做,然后我們生成一個(gè)遷移,從遷移狀態(tài)中刪除模型,而不是數(shù)據(jù)庫。此遷移中的操作如下所示

  1. operations = [ 
  2.         migrations.SeparateDatabaseAndState( 
  3.             state_operations=[migrations.DeleteModel(name="AlertRuleTriggerAction")], 
  4.             database_operations=[], 
  5.         ) 
  6.     ] 

并且生成的 SQL 顯示沒有發(fā)生數(shù)據(jù)庫更改。所以現(xiàn)在我們部署它并進(jìn)入最后一步。

在這最后一步中,我們只想手動(dòng)編寫 DDL 來刪除表。所以我們使用 sentry django makemigrations --empty 來產(chǎn)生一個(gè)空的遷移,然后修改操作如下:

  1. operations = [ 
  2.         migrations.RunSQL( 
  3.             ""
  4.             DROP TABLE "sentry_alertruletriggeraction"
  5.             """, 
  6.             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. 
  7.         ) 
  8.     ] 

然后我們部署它,我們就完成了。

外鍵

創(chuàng)建外鍵大多沒問題,但是對于像 Project、Group 這樣的大/繁忙的表,由于獲取鎖的困難,它可能會導(dǎo)致問題。您仍然可以創(chuàng)建 Django 級別的外鍵,而無需創(chuàng)建數(shù)據(jù)庫約束。為此,請?jiān)诙x鍵時(shí)設(shè)置 db_constraint=False。

重命名表

重命名表很危險(xiǎn),會導(dǎo)致停機(jī)。發(fā)生這種情況的原因是在部署期間將運(yùn)行舊/新代碼的混合。因此,一旦我們在 Postgres 中重命名該表,如果舊代碼嘗試訪問它,它就會立即開始出錯(cuò)。有兩種方法可以處理重命名表:

  • 不要在 Postgres 中重命名表。相反,只需在 Django 中重命名模型,并確保將 Meta.db_table 設(shè)置為當(dāng)前表名,這樣不會有任何中斷。這是首選方法。
  • 如果你真的想重命名表,那么步驟將是:
  • 使用新名稱創(chuàng)建一個(gè)表
  • 開始對舊表和新表進(jìn)行雙重寫入,最好是在事務(wù)中。
  • 將舊行回填到新表中。
  • 將 model 更改為從新表開始讀取。
  • 停止寫入舊表并從代碼中刪除引用。
  • 丟棄舊表。
  • 一般來說,這是不值得做的,與回報(bào)相比,這需要冒很多風(fēng)險(xiǎn)/付出很多努力。

添加列

創(chuàng)建新列時(shí),它們應(yīng)始終創(chuàng)建為可為空的。這是出于兩個(gè)原因:

  • 如果存在現(xiàn)有行,添加非空列需要設(shè)置默認(rèn)值,添加默認(rèn)值需要完全重寫表。這是危險(xiǎn)的,很可能會導(dǎo)致停機(jī)
  • 在部署期間,新舊代碼混合運(yùn)行。如果舊代碼嘗試向表中插入一行,則插入將失敗,因?yàn)榕f代碼不知道新列存在,因此無法為該列提供值。

向列添加 NOT NULL

將 not null 添加到列可能很危險(xiǎn),即使該列的表的每一行都有數(shù)據(jù)。這是因?yàn)?Postgres 仍然需要對所有行執(zhí)行非空檢查,然后才能添加約束。在小表上這可能沒問題,因?yàn)闄z查會很快,但在大表上這可能會導(dǎo)致停機(jī)。這里有幾個(gè)選項(xiàng)可以確保安全:

  • ALTER TABLE tbl ADD CONSTRAINT cnstr CHECK (col IS NOT NULL) NOT VALID; ALTER TABLE tbl VALIDATE CONSTRAINT cnstr;. 首先,我們將約束創(chuàng)建為無效。然后我們之后驗(yàn)證它。我們?nèi)匀恍枰獟呙枵麄€(gè)表來驗(yàn)證,但我們只需要持有一個(gè) SHARE UPDATE EXCLUSIVE 鎖,它只會阻止其他 ALTER TABLE 命令,但允許讀/寫繼續(xù)。這很有效,但會有 0.5-1% 的輕微性能損失。在 Postgres 12 之后,我們可以擴(kuò)展這個(gè)方法來添加一個(gè)真正的 NOT NULL 約束。
  • 如果表足夠小并且體積足夠小,那么創(chuàng)建一個(gè)普通的 NOT NULL 約束應(yīng)該是安全的。小是幾百萬行或更少。

添加具有默認(rèn)值的列

向現(xiàn)有表添加具有默認(rèn)值的列是危險(xiǎn)的。這需要 Postgres 鎖定表并重寫它。相反,更好的選擇是:

在 Postgres 中添加沒有默認(rèn)值的列,但在 Django 中添加默認(rèn)值。這使我們能夠確保所有新行都具有默認(rèn)值。這是通過修改遷移文件以包含 migrations.SeperateDatabaseAndState 來完成的

  1. operations = [ 
  2.     migrations.SeparateDatabaseAndState( 
  3.         database_operations=[ 
  4.             migrations.AddField( 
  5.                 model_name="mymodel"
  6.                 name="new_field"
  7.                 # Don't use a default in Postgres, a data migration can be used afterward to backfill 
  8.                 field=models.PositiveSmallIntegerField(null=True), 
  9.             ), 
  10.         ], 
  11.         state_operations=[ 
  12.             migrations.AddField( 
  13.                 model_name="mymodel"
  14.                 name="new_field"
  15.                 # Use the default in Django, new rows will use the specified default 
  16.                 field=models.PositiveSmallIntegerField(null=Truedefault=1), 
  17.             ), 
  18.         ], 
  19.     ) 
  20.     ] 
  • 通過數(shù)據(jù)遷移使用默認(rèn)值回填預(yù)先存在的行。

改變列類型

改變列的類型通常是危險(xiǎn)的,因?yàn)樗枰貙懻麄€(gè)表。有一些例外:

  • 將 varchar() 更改為更大尺寸的 varchar。
  • 將任何 varchar 更改為 text
  • 將 numeric 更改為 numeric,其中 precision 更高但 scale 相同。

對于任何其他類型,最好的前進(jìn)路徑通常是:

  • 創(chuàng)建具有新類型的列。
  • 開始對新舊列進(jìn)行雙重寫入。
  • 回填并將舊列值轉(zhuǎn)換為新列。
  • 更改代碼以使用新字段。
  • 停止寫入舊列并從代碼中刪除引用。
  • 從數(shù)據(jù)庫中刪除舊列。
  • 通常,這值得在 #discuss-backend 中討論。

重命名列

重命名列是危險(xiǎn)的,會導(dǎo)致停機(jī)。發(fā)生這種情況的原因是在部署期間將運(yùn)行舊/新代碼的混合。因此,一旦我們在 Postgres 中重命名該列,如果舊代碼嘗試訪問它,它就會立即開始出錯(cuò)。有兩種方法可以處理重命名列:

  • 不要重命名 Postgres 中的列。相反,只需在 Django 中重命名字段,并在定義中使用 db_column 將其設(shè)置為現(xiàn)有的列名,這樣就不會中斷。這是首選方法。
  • 如果你真的想重命名列,那么步驟將是:
    • 創(chuàng)建具有新名稱的列
    • 開始對新舊列進(jìn)行雙重寫入。
    • 將舊列值回填到新列中。
    • 將字段更改為從新列開始讀取。
    • 停止寫入舊列并從代碼中刪除引用。
    • 從數(shù)據(jù)庫中刪除舊列。

一般來說,這是不值得做的,與回報(bào)相比,這需要冒很多風(fēng)險(xiǎn)/付出很多努力。

 

責(zé)任編輯:武曉燕 來源: 黑客下午茶
相關(guān)推薦

2022-01-15 23:33:47

SentryPyCharm配置

2022-01-18 23:26:45

開發(fā)

2022-01-11 20:42:54

開發(fā)Sentry標(biāo)志

2022-01-17 19:34:43

SentryWeb APISentry API

2022-01-02 23:26:08

開發(fā)SDK Sentry

2022-01-03 22:59:30

開發(fā)SDK數(shù)據(jù)

2021-12-15 20:06:48

ReactJSSentry開發(fā)者

2022-01-21 21:33:03

開發(fā)JavaScript應(yīng)用

2021-12-25 22:31:55

Sentry 監(jiān)控SDK 開發(fā) 性能監(jiān)控

2022-01-13 20:13:31

元宇宙搜索引擎

2021-12-31 18:35:40

監(jiān)控Sentry開發(fā)

2022-01-02 06:59:43

SentrySDK 開發(fā)客戶端報(bào)告

2021-12-16 20:12:37

后端開發(fā)Sentry

2022-01-19 19:49:53

Sentry瀏覽器SDK

2022-01-20 19:49:10

Sentry開發(fā)Scope

2021-12-17 19:15:51

前端蟲洞狀態(tài)

2017-04-01 18:00:08

開發(fā)者數(shù)據(jù)庫

2015-07-22 16:08:46

OpenStack開源貢獻(xiàn)代碼

2011-03-16 09:38:05

2011-03-16 09:33:45

數(shù)據(jù)庫開發(fā)錯(cuò)誤
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

日韩精品在线第一页| 一区二区三区日韩欧美精品| 国产精品99久久久久久人| 五月婷六月丁香| 一区在线不卡| 一卡二卡三卡日韩欧美| 欧美凹凸一区二区三区视频| 精品国产www| 欧美色一级片| 中文字幕亚洲国产| 野战少妇38p| 欧美日韩国产网站| 亚洲国产精品一区二区www | 国产视频九色蝌蚪| av电影在线网| 99国产精品久久| 成人两性免费视频| 台湾佬中文在线| 欧美精品播放| 日韩中文第一页| 三级网站在线免费观看| 中文字幕日韩高清在线| 欧美在线观看一二区| 亚洲熟妇无码一区二区三区导航| 川上优的av在线一区二区| 粉嫩av一区二区三区| 国产成人一区二| 豆国产97在线 | 亚洲| 国产精品成久久久久| 亚洲欧洲日本专区| 老司机午夜免费福利| 二区三区精品| 在线观看日韩av先锋影音电影院| 成年人网站免费视频| 18网站在线观看| 国产精品你懂的| 欧美资源一区| 日本免费不卡| 99re成人精品视频| 国产欧美日韩在线播放| 国产av无码专区亚洲a∨毛片| 日本不卡123| 国产精品成人一区二区三区吃奶 | 色综合色综合色综合色综合色综合 | 无码国产精品一区二区免费16| 韩国v欧美v日本v亚洲v| 国产精品永久免费观看| 欧美成人一区二区视频| 性欧美xxxx大乳国产app| 高清欧美性猛交| 久久精品国产亚洲av香蕉| 一区二区日韩欧美| 大胆人体色综合| 91视频综合网| 国产一区日韩一区| 欧美日韩国产成人在线观看| 欧美日韩精品一区二区三区视频播放| 欧美独立站高清久久| 最好看的2019的中文字幕视频| 中文字幕人妻一区二区三区在线视频| 久久99青青| 亚洲天堂视频在线观看| 一级特黄曰皮片视频| 成人免费在线观看av| 在线观看精品自拍私拍| 九九这里只有精品视频| 你懂的一区二区| 久久久久久久久久久久av| 日本三级黄色大片| 久久av最新网址| 国产精品美女呻吟| 国产欧美第一页| 成人美女在线视频| 久久国产精品-国产精品| 日韩在线免费播放| 日本一区二区三区免费乱视频| 日本免费高清一区二区| 三区四区电影在线观看| 亚洲激情第一区| 波多野结衣之无限发射| 都市激情亚洲一区| 欧美日产在线观看| 亚洲一区和二区| 日韩在线麻豆| www国产精品视频| 久久亚洲AV无码| 久久一区亚洲| 91中文字幕在线观看| 神马午夜一区二区| 久久久久久免费毛片精品| 亚洲欧美日韩综合一区| 色女人在线视频| 欧美性猛交xxxx黑人| 日本高清久久久| 久久精品亚洲成在人线av网址| 中文字幕欧美精品在线| 欧美日韩激情在线观看| 久久久久一区| 97伦理在线四区| 青青操视频在线| 亚洲精品免费在线观看| 日本在线观看a| 国产95亚洲| 亚洲人永久免费| 麻豆影视在线播放| 美女在线观看视频一区二区| 翡翠波斯猫1977年美国| av在线免费一区| 亚洲6080在线| 四虎成人在线播放| 国产欧美高清视频在线| 久久久久久久久久久国产| 伊人网站在线观看| 97超碰欧美中文字幕| 日韩视频在线观看视频| 不卡一二三区| 亚洲高清久久网| 看免费黄色录像| 青青青爽久久午夜综合久久午夜| 国产欧美日韩一区二区三区| 成人ww免费完整版在线观看| 色偷偷一区二区三区| 岛国精品一区二区三区| 99精品视频在线观看播放| 奇米四色中文综合久久| 亚洲乱色熟女一区二区三区| 亚洲欧洲韩国日本视频| 天天碰免费视频| 欧美电影在线观看免费| 欧美激情一级欧美精品| 国产美女精品视频国产| 成人欧美一区二区三区小说 | 精品一区二区三区香蕉蜜桃| 日本视频一区在线观看| 中文字幕乱码中文乱码51精品| 精品国内二区三区| 男女羞羞免费视频| 国产在线视频不卡二| 伊人久久大香线蕉av一区| 欧美日韩不卡| 国产亚洲精品美女久久久久| 日韩在线 中文字幕| 久久综合色综合88| 国产精品后入内射日本在线观看| 国产精伦一区二区三区| 欧美极品少妇全裸体| 午夜免费福利视频| 亚洲一区二区三区自拍| 26uuu国产| 红桃视频亚洲| 国产精品日韩一区二区免费视频 | 国产97免费视| 国产在线一二| 欧美性视频一区二区三区| a天堂中文字幕| 日本亚洲天堂网| 亚洲制服欧美久久| 成人国产精品久久| 九九精品视频在线观看| 黄色美女一级片| 欧美日韩免费在线| 国产精品扒开腿做爽爽| 日本不卡的三区四区五区| 一区二区三区欧美成人| 国产精品亚洲欧美一级在线| 欧美日韩成人在线播放| 黄片毛片在线看| 日韩欧美在线播放| 又色又爽的视频| 国产乱码精品一品二品| www.九色.com| 亚洲精品亚洲人成在线| 国产精品久久久久91| 好吊日视频在线观看| 欧美mv日韩mv| 日本中文字幕在线| 国产精品久久一卡二卡| 精品伦一区二区三区| 国产精品久久777777毛茸茸| 日韩中文字幕av在线| 国产视频一区二区在线播放| 国内成人精品视频| 国产日本在线视频| 日韩视频免费直播| 日韩xxxxxxxxx| 国产精品免费丝袜| 久久久久中文字幕亚洲精品| 模特精品在线| 中文字幕免费高| 秋霞蜜臀av久久电影网免费 | 国产原创中文av| 亚洲成人自拍一区| 懂色av蜜桃av| 成人看片黄a免费看在线| 免费在线观看毛片网站| 91精品一区国产高清在线gif | 清纯唯美日韩制服另类| 在线看免费av| 亚洲激情视频在线播放| 一级特黄录像免费看| 五月天中文字幕一区二区| 国产sm调教视频| 成人性生交大片免费看视频在线| 成人黄色一区二区| 亚洲先锋成人| 亚洲欧洲日本国产| 噜噜噜狠狠夜夜躁精品仙踪林| 国产欧美亚洲精品| 麻豆成全视频免费观看在线看| 日韩综合视频在线观看| 天堂√在线中文官网在线| 欧美一级xxx| 少妇一级淫片日本| 精品女同一区二区三区在线播放| 日韩成人短视频| 欧美韩国日本综合| 精品人妻一区二区三区日产乱码卜| 国产综合色视频| 一级在线免费视频| 国产日韩欧美一区在线| 97碰在线视频| 亚洲精品午夜av福利久久蜜桃| 日本高清不卡三区| 日韩伦理一区二区三区| 国产精品日韩一区二区| 亚洲va欧美va人人爽成人影院| 国产精品日本精品| 欧洲亚洲两性| 欧美在线观看一区二区三区| 丰满诱人av在线播放| 九九热精品视频国产| 欧美黑人激情| 最近2019中文字幕一页二页| 韩日视频在线| 亚洲欧美福利视频| 欧洲成人av| 亚洲欧美色婷婷| 你懂的在线视频| 亚洲欧美在线x视频| 欧洲毛片在线| 亚洲午夜久久久影院| 欧美日韩免费做爰大片| 精品一区二区电影| 欧美日韩影视 | 国产黄色在线观看| 日韩三级影视基地| 婷婷五月在线视频| 久久精品视频在线观看| 免费观看在线黄色网| 精品国内自产拍在线观看| 免费在线观看av网站| 精品国产一区二区三区久久久| 午夜在线视频| 久久久国产精品x99av | 无码国产精品一区二区色情男同 | av在线免费网站| 欧美另类暴力丝袜| 波多野结衣精品| 97色在线观看免费视频| 中文av在线全新| 国产精品国产亚洲伊人久久| 成人在线黄色| 亚洲在线第一页| 久久99国产精品久久99大师| 久久99精品久久久久久久青青日本| 偷拍自拍亚洲色图| 亚洲图片都市激情| 亚洲女同中文字幕| 久艹在线免费观看| 免费欧美在线| 三级av免费观看| 国产一区二区三区不卡在线观看| 台湾佬美性中文| 91亚洲国产成人精品一区二区三| 蜜桃无码一区二区三区| 国产精品久久看| 日本一级淫片色费放| 在线视频国产一区| 国产精品伊人久久 | 超碰国产在线| 欧美大胆在线视频| 性感女国产在线| 成人av番号网| 久久porn| 五月天综合婷婷| 国产精品毛片| 日韩成人精品视频在线观看| 成人av电影在线| 农村老熟妇乱子伦视频| 亚洲一区二区三区免费视频| 亚洲天堂男人av| 日韩丝袜美女视频| 精品久久av| 欧美激情奇米色| www.26天天久久天堂| 国产精品精品软件视频| 日韩电影免费网站| 日韩精品xxxx| 国产精品99久久久久久似苏梦涵| 蜜桃av免费看| 香蕉久久一区二区不卡无毒影院| 自拍偷拍福利视频| 亚洲精品成人网| av免费在线免费| 国产精品久久久久久久久久久久久久 | 欧美日韩精品免费| 香蕉国产在线视频| 操91在线视频| 99亚洲伊人久久精品影院| 极品尤物一区二区三区| 外国成人免费视频| 欧美精品成人网| av一二三不卡影片| 青青草精品在线视频| 欧美日韩中字一区| 午夜视频福利在线观看| 欧美激情免费观看| 91精品国产一区二区在线观看| 欧美在线日韩精品| 亚洲在线观看| 91玉足脚交白嫩脚丫| 一区二区三区在线观看视频| 一级α片免费看刺激高潮视频| 日韩精品在线私人| av资源在线| 成人一区二区在线| 综合天堂av久久久久久久| 污污动漫在线观看| 国产日韩精品一区二区三区在线| 国产91精品一区| 亚洲成人av中文字幕| 久久久123| 亚洲直播在线一区| 亚洲天天影视网| 欧美视频亚洲图片| 亚洲欧美一区二区三区孕妇| 亚洲视频在线观看一区二区| 国产一区二区日韩精品欧美精品| 一区二区电影免费观看| 免费国产一区二区| 免费永久网站黄欧美| 亚洲天堂资源在线| 婷婷开心久久网| 日本ー区在线视频| 日本国产欧美一区二区三区| 亚洲成人一品| 无码人妻丰满熟妇区毛片18| 久久久蜜桃精品| 波多野结衣电车痴汉| 国产一区二区三区四区福利| 91精品影视| 视频一区视频二区视频| 石原莉奈在线亚洲二区| 五月婷六月丁香| 欧美伦理视频网站| caoporm免费视频在线| 91视频最新| 一本一本久久| 一级黄色性视频| 欧美视频第二页| 国产欧美久久久久久久久| 97av影视网在线观看| 亚洲国产一区二区精品专区| 人妻丰满熟妇av无码久久洗澡| 在线视频一区二区三| 免费在线观看黄色网| 国产精品毛片va一区二区三区| 亚洲国产导航| xxxxx在线观看| 欧美精品v日韩精品v韩国精品v| 怡红院av在线| 久久精品国产精品青草色艺| 日韩高清在线电影| 国产极品国产极品| 日韩精品视频在线观看免费| 日韩成人亚洲| 手机看片日韩国产| 成人av在线资源| 国产美女www爽爽爽| 欧美成人一区在线| 欧美亚洲tv| 在线能看的av网站| 亚洲妇熟xx妇色黄| 91社区在线观看播放| 爱情岛论坛亚洲入口| 天堂一区二区在线| 国产一区二区三区在线视频观看| 亚洲国产免费av| 日韩综合久久| koreanbj精品视频一区| 亚洲视频免费观看| 日韩有码电影| 99视频免费观看蜜桃视频| 久久国产高清| 欧美激情精品久久| 国产午夜精品一区二区三区| 伊人精品久久| 男人添女人下面免费视频| 午夜在线成人av| 黄网页免费在线观看|