成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 快速掌握和使用Flyway的詳細(xì)教程

快速掌握和使用Flyway的詳細(xì)教程

熱門標(biāo)簽:聯(lián)通外呼系統(tǒng)電腦app軟件 外呼系統(tǒng)怎么群發(fā)短信 蘇州呼叫中心外呼系統(tǒng)哪家強(qiáng) 谷歌地圖標(biāo)注日期 400電話辦理費(fèi)用低 鶴壁高頻外呼系統(tǒng)多少錢一個月 400電話申請到底哪家好 宿遷怎么辦理400電話 地圖標(biāo)注項(xiàng)目幾個月

什么是Flyway?

轉(zhuǎn)載:https://blog.waterstrong.me/flyway-in-practice/

Flyway is an open-source database migration tool. It strongly favors simplicity and convention over configuration.

Flyway是一款開源的數(shù)據(jù)庫版本管理工具,它更傾向于規(guī)約優(yōu)于配置的方式。Flyway可以獨(dú)立于應(yīng)用實(shí)現(xiàn)管理并跟蹤數(shù)據(jù)庫變更,支持?jǐn)?shù)據(jù)庫版本自動升級,并且有一套默認(rèn)的規(guī)約,不需要復(fù)雜的配置,Migrations可以寫成SQL腳本,也可以寫在Java代碼中,不僅支持Command Line和Java API,還支持Build構(gòu)建工具和Spring Boot等,同時在分布式環(huán)境下能夠安全可靠地升級數(shù)據(jù)庫,同時也支持失敗恢復(fù)等。

Flyway主要基于6種基本命令:Migrate,Clean,Info,Validate,BaselineandRepair,稍候會逐一分析講解。目前支持的數(shù)據(jù)庫主要有:Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL(including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL(including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix.

關(guān)于Flyway的優(yōu)勢,支持的數(shù)據(jù)庫以及與其他數(shù)據(jù)庫版本工具的對比,可以閱讀Flyway官網(wǎng)介紹。

為什么使用Flyway?

通常在項(xiàng)目開始時會針對數(shù)據(jù)庫進(jìn)行全局設(shè)計(jì),但在開發(fā)產(chǎn)品新特性過程中,難免會遇到需要更新數(shù)據(jù)庫Schema的情況,比如:添加新表,添加新字段和約束等,這種情況在實(shí)際項(xiàng)目中也經(jīng)常發(fā)生。那么,當(dāng)開發(fā)人員完成了對數(shù)據(jù)庫更的SQL腳本后,如何快速地在其他開發(fā)者機(jī)器上同步?并且如何在測試服務(wù)器上快速同步?以及如何保證集成測試能夠順利執(zhí)行并通過呢?

假設(shè)以Spring Boot技術(shù)棧項(xiàng)目為例,可能有人會說,本地使用Hibernate自動更新數(shù)據(jù)庫Schema模式,然后讓QA或DEV到測試服務(wù)器上手動執(zhí)行SQL腳本,同時可以寫一個Gradle任務(wù)自動執(zhí)行更新。

個人覺得,對于Hibernate自動更新數(shù)據(jù)庫,感覺不靠譜,不透明,控制自由度不高,而且有時很容易就會犯錯,比如:用SQL創(chuàng)建的某個字段為VARCHAR類型,而在Entity中配置的為CHAR類型,那么在運(yùn)行集成測試時,自動創(chuàng)建的數(shù)據(jù)庫表中的字段為CHAR類型,而實(shí)際SQL腳本期望的是VARCHAR類型,雖然測試通過了,但不是期望的行為,并且在本地bootRun或服務(wù)器上運(yùn)行Service時都會失敗。另外,到各測試服務(wù)器上手動執(zhí)行SQL腳本費(fèi)時費(fèi)神費(fèi)力的,干嘛不自動化呢,當(dāng)然,對于高級別和PROD環(huán)境,還是需要DBA手動執(zhí)行的。最后,寫一段自動化程序來自動執(zhí)行更新,想法是很好的,那如果已經(jīng)有了一些插件或庫可以幫助你更好地實(shí)現(xiàn)這樣的功能,為何不好好利用一下呢,當(dāng)然,如果是為了學(xué)習(xí)目的,重復(fù)造輪子是無可厚非的。

其實(shí),以上問題可以通過Flyway工具來解決,F(xiàn)lyway可以實(shí)現(xiàn)自動化的數(shù)據(jù)庫版本管理,并且能夠記錄數(shù)據(jù)庫版本更新記錄,F(xiàn)lyway官網(wǎng)對Why database migrations結(jié)合示例進(jìn)行了詳細(xì)的闡述,有興趣可以參閱一下。

Flyway如何工作的?

Flyway對數(shù)據(jù)庫進(jìn)行版本管理主要由Metadata表和6種命令完成,Metadata主要用于記錄元數(shù)據(jù),每種命令功能和解決的問題范圍不一樣,以下分別對metadata表和這些命令進(jìn)行闡述,其中的示意圖都來自Flyway的官方文檔。

Metadata Table

Flyway中最核心的就是用于記錄所有版本演化和狀態(tài)的Metadata表,在Flyway首次啟動時會創(chuàng)建默認(rèn)名為SCHEMA_VERSION的元數(shù)據(jù)表,其表結(jié)構(gòu)為(以MySQL為例):

Field Type Null Key Default
version_rank int(11) NO MUL NULL
installed_rank int(11) NO MUL NULL
version varchar(50) NO PRI NULL
description varchar(200) NO   NULL
type varchar(20) NO   NULL
script varchar(1000) NO   NULL
checksum int(11) YES   NULL
installed_by varchar(100) NO   NULL
installed_on timestamp NO   CURRENT_TIMESTAMP
execution_time int(11) NO   NULL
success tinyint(1) NO MUL NULL

Flyway官網(wǎng)上提供了一個很清晰的示例How Flyway works,可以參閱一下。

Migrate

Migrate是指把數(shù)據(jù)庫Schema遷移到最新版本,是Flyway工作流的核心功能,F(xiàn)lyway在Migrate時會檢查Metadata(元數(shù)據(jù))表,如果不存在會創(chuàng)建Metadata表,Metadata表主要用于記錄版本變更歷史以及Checksum之類的。

Migrate時會掃描指定文件系統(tǒng)或Classpath下的Migrations(可以理解為數(shù)據(jù)庫的版本腳本),并且會逐一比對Metadata表中的已存在的版本記錄,如果有未應(yīng)用的Migrations,F(xiàn)lyway會獲取這些Migrations并按次序Apply到數(shù)據(jù)庫中,否則不需要做任何事情。另外,通常在應(yīng)用程序啟動時應(yīng)默認(rèn)執(zhí)行Migrate操作,從而避免程序和數(shù)據(jù)庫的不一致性。

Clean

Clean相對比較容易理解,即清除掉對應(yīng)數(shù)據(jù)庫Schema中的所有對象,包括表結(jié)構(gòu),視圖,存儲過程,函數(shù)以及所有的數(shù)據(jù)等都會被清除。

Clean操作在開發(fā)和測試階段是非常有用的,它能夠幫助快速有效地更新和重新生成數(shù)據(jù)庫表結(jié)構(gòu),但特別注意的是:不應(yīng)在Production的數(shù)據(jù)庫上使用!

Info

Info用于打印所有Migrations的詳細(xì)和狀態(tài)信息,其實(shí)也是通過Metadata表和Migrations完成的,下圖很好地示意了Info打印出來的信息。

Info能夠幫助快速定位當(dāng)前的數(shù)據(jù)庫版本,以及查看執(zhí)行成功和失敗的Migrations。

Validate

Validate是指驗(yàn)證已經(jīng)Apply的Migrations是否有變更,F(xiàn)lyway是默認(rèn)是開啟驗(yàn)證的。

Validate原理是對比Metadata表與本地Migrations的Checksum值,如果值相同則驗(yàn)證通過,否則驗(yàn)證失敗,從而可以防止對已經(jīng)Apply到數(shù)據(jù)庫的本地Migrations的無意修改。

Baseline

Baseline針對已經(jīng)存在Schema結(jié)構(gòu)的數(shù)據(jù)庫的一種解決方案,即實(shí)現(xiàn)在非空數(shù)據(jù)庫中新建Metadata表,并把Migrations應(yīng)用到該數(shù)據(jù)庫。

Baseline可以應(yīng)用到特定的版本,這樣在已有表結(jié)構(gòu)的數(shù)據(jù)庫中也可以實(shí)現(xiàn)添加Metadata表,從而利用Flyway進(jìn)行新Migrations的管理了。

Repair

Repair操作能夠修復(fù)Metadata表,該操作在Metadata表出現(xiàn)錯誤時是非常有用的。

Repair會修復(fù)Metadata表的錯誤,通常有兩種用途:

  • 移除失敗的Migration記錄,該問題只是針對不支持DDL事務(wù)的數(shù)據(jù)庫。
  • 重新調(diào)整已經(jīng)應(yīng)用的Migratons的Checksums值,比如:某個Migratinon已經(jīng)被應(yīng)用,但本地進(jìn)行了修改,又期望重新應(yīng)用并調(diào)整Checksum值,不過盡量不要這樣操作,否則可能造成其它環(huán)境失敗。

如何使用Flyway?

這里將主要關(guān)注在Gradle和Spring Boot中集成并使用Flyway,數(shù)據(jù)庫通常會采用MySQL、PostgreSQL、H2或Hsql等。

正確創(chuàng)建Migrations

Migrations是指Flyway在更新數(shù)據(jù)庫時是使用的版本腳本,比如:一個基于Sql的Migration命名為V1__init_tables.sql,內(nèi)容即是創(chuàng)建所有表的sql語句,另外,F(xiàn)lyway也支持基于Java的Migration。Flyway加載Migrations的默認(rèn)Locations為classpath:db/migration,也可以指定filesystem:/project/folder,其加載是在Runtime自動遞歸地執(zhí)行的。

除了需要指定Location外,F(xiàn)lyway對Migrations的掃描還必須遵從一定的命名模式,Migration主要分為兩類:Versioned和Repeatable。

Versioned migrations

一般常用的是Versioned類型,用于版本升級,每一個版本都有一個唯一的標(biāo)識并且只能被應(yīng)用一次,并且不能再修改已經(jīng)加載過的Migrations,因?yàn)镸etadata表會記錄其Checksum值。其中的version標(biāo)識版本號,由一個或多個數(shù)字構(gòu)成,數(shù)字之間的分隔符可以采用點(diǎn)或下劃線,在運(yùn)行時下劃線其實(shí)也是被替換成點(diǎn)了,每一部分的前導(dǎo)零會被自動忽略。

Repeatable migrations

Repeatable是指可重復(fù)加載的Migrations,其每一次的更新會影響Checksum值,然后都會被重新加載,并不用于版本升級。對于管理不穩(wěn)定的數(shù)據(jù)庫對象的更新時非常有用。Repeatable的Migrations總是在Versioned之后按順序執(zhí)行,但開發(fā)者必須自己維護(hù)腳本并且確??梢灾貜?fù)執(zhí)行,通常會在sql語句中使用CREATE OR REPLACE來保證可重復(fù)執(zhí)行。

默認(rèn)情況下基于Sql的Migration文件的命令規(guī)則如下圖所示:

其中的文件名由以下部分組成,除了使用默認(rèn)配置外,某些部分還可自定義規(guī)則。

  • prefix: 可配置,前綴標(biāo)識,默認(rèn)值V表示Versioned,R表示Repeatable
  • version: 標(biāo)識版本號,由一個或多個數(shù)字構(gòu)成,數(shù)字之間的分隔符可用點(diǎn).或下劃線_
  • separator: 可配置,用于分隔版本標(biāo)識與描述信息,默認(rèn)為兩個下劃線__
  • description: 描述信息,文字之間可以用下劃線或空格分隔
  • suffix: 可配置,后續(xù)標(biāo)識,默認(rèn)為.sql

另外,關(guān)于如何使用基于Java的Migrations,有興趣可以參考Java-based migrations。

支持的數(shù)據(jù)庫
目前Flyway支持的數(shù)據(jù)庫還是挺多的,包括:Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL(including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL(including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix。
目前來說,個人用得比較多的數(shù)據(jù)庫是PostgreSQL、MySQL、H2和Hsql,針對每種數(shù)據(jù)庫的flyway.url示例配置為:

另外,關(guān)于如何使用基于Java的Migrations,有興趣可以參考Java-based migrations。

支持的數(shù)據(jù)庫

目前Flyway支持的數(shù)據(jù)庫還是挺多的,包括:Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL(including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL(including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix。
目前來說,個人用得比較多的數(shù)據(jù)庫是PostgreSQL、MySQL、H2和Hsql,針對每種數(shù)據(jù)庫的flyway.url示例配置為:

# PostgreSQL
flyway.url = jdbc:postgresql://localhost:5432/postgres?currentSchema=myschema
# MySQL
flyway.url = jdbc:mysql://localhost:3306/testdb?serverTimezone=UTCuseSSL=true
# H2
flyway.url = jdbc:h2:./.tmp/testdb
# Hsql
flyway.url = jdbc:hsqldb:hsql//localhost:1476/testdb

Flyway命令行

Flyway的命令行工具支持直接在命令行中運(yùn)行Migrate,Clean,Info,Validate,BaselineRepair6種命令,不需要借助其他Build工具,不需要應(yīng)用程序運(yùn)行在JVM中,只需要單純的命令行即可,但需要根據(jù)不同的操作系統(tǒng)下載并安裝該命令行工具。Flyway會依次搜索以下配置文件,越靠后的配置會覆蓋靠前的配置:

  • /conf/flyway.conf
  • /flyway.conf
  • /flyway.conf

一個典型Flyway項(xiàng)目示例目錄結(jié)構(gòu)如下:

更多關(guān)于Flyway命令行使用可以參考Flyway Command-line。

在Gradle中的應(yīng)用

首先需要在Gradle中引入Flyway插件,通常有兩種方式:

方式一:采用buildscript依賴方式。

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.flywaydb:flyway-gradle-plugin:4.0.3")
}
}
apply plugin: 'org.flywaydb.flyway'

方式二(推薦):采用DSL方式引用Plugins。

plugins {
id "org.flywaydb.flyway" version "4.0.3"
}

而在Gradle中配置Flyway Properties有兩種方式:

方式一:在build.gradle中配置Flyway Properties。

flyway {
url = jdbc:h2:./.tmp/testdb
user = sa
password =
}
# 或者寫成:
project.ext['flyway.url'] = 'jdbc:h2:./.tmp/testdb'
project.ext['flyway.user'] = 'sa'
project.ext['flyway.password'] = ''

方式二:在gradle.properties中配置Flyway Properties。

flyway.url = jdbc:h2:./.tmp/testdb
flyway.user = sa
flyway.password =

如果期望在運(yùn)行Gradle Clean/Build Tasks時自動執(zhí)行Flyway的某些任務(wù),可以設(shè)置dependsOn,若不期望隱式執(zhí)行Flyway任務(wù),可以不配置。

clean.dependsOn flywayRepair # To repair the Flyway metadata table
build.dependsOn flywayMigrate # To migrate the schema to the latest version

另外,其它Tasks:flywayInfo,flywayValidate,flywayBaseline分別對應(yīng)到Flyway的命令。在使用Spring Boot時,運(yùn)行./gradlew bootRun會自動檢查并加載最新的db.migration腳本。

特別注意:在Production環(huán)境中不應(yīng)執(zhí)行./gradlew flywayClean,除非你知道自己的行為和目的,因?yàn)樵撁顣宄械臄?shù)據(jù)庫對象,相當(dāng)危險。

更多關(guān)于Flyway在Gradle中的使用請參閱Flyway Gradle Plugin。

與Spring Boot集成

在Spring Boot中,如果加入Flyway的依賴,則會自動引用Flyway并使用默認(rèn)值,但可以修改并配置FlywayProperties。

flyway.baseline-description= # The description to tag an existing schema with when executing baseline.
flyway.baseline-version=1 # Version to start migration.
flyway.baseline-on-migrate=false # Whether to execute migration against a non-empty schema with no metadata table
flyway.check-location=false # Check that migration scripts location exists.
flyway.clean-on-validation-error=false # will clean all objects. Warning! Do NOT enable in production!
flyway.enabled=true # Enable flyway.
flyway.encoding=UTF-8 # The encoding of migrations.
flyway.ignore-failed-future-migration=true # Ignore future migrations when reading the metadata table.
flyway.init-sqls= # SQL statements to execute to initialize a connection immediately after obtaining it.
flyway.locations=classpath:db/migration # locations of migrations scripts.
flyway.out-of-order=false # Allows migrations to be run "out of order".
flyway.placeholder-prefix= # The prefix of every placeholder.
flyway.placeholder-replacement=true # Whether placeholders should be replaced.
flyway.placeholder-suffix=} # The suffix of every placeholder.
flyway.placeholders.*= # Placeholders to replace in Sql migrations.
flyway.schemas= # Default schema of the connection and updating
flyway.sql-migration-prefix=V # The file name prefix for Sql migrations
flyway.sql-migration-separator=__ # The file name separator for Sql migrations
flyway.sql-migration-suffix=.sql # The file name suffix for Sql migrations
flyway.table=schema_version # The name of Flyway's metadata table.
flyway.url= # JDBC url of the database to migrate. If not set, the primary configured data source is used.
flyway.user= # Login user of the database to migrate. If not set, use spring.datasource.username value.
flyway.password= # JDBC password if you want Flyway to create its own DataSource.
flyway.validate-on-migrate=true # Validate sql migration CRC32 checksum in classpath.

若使用Gradle,通常在build.gradle引入org.flywaydb:flyway-core:4.0.3依賴后即可使用。可能會有以下幾種需求:

  • 在本地Run和Tests都會使用內(nèi)存數(shù)據(jù)庫,其中的spring.jpa.hibernate.ddl-auto都設(shè)置為validate,Schema不需要Hibernate自動生成,并期望使用Flyway,而在線上環(huán)境會使用真實(shí)數(shù)據(jù)庫,并不期望使用Flyway,如何實(shí)現(xiàn)呢?
  • 解決方案:可以在common.properties中配置flyway.enabled=false,然后在local或dev的配置中啟用Flyway即可。通常推薦使用此模式,畢竟可以對不同的環(huán)境進(jìn)行控制,另外本地Run不會依賴真實(shí)數(shù)據(jù)庫,又能保證數(shù)據(jù)庫Schema是按腳本創(chuàng)建的。
  • 在運(yùn)行Tests會使用內(nèi)存數(shù)據(jù)庫,有單獨(dú)的配置文件,不使用Flyway,而在本地bootRun時會使用真實(shí)數(shù)據(jù)庫,使用Flyway,畢竟不想每次Schema改后都在本地手動去執(zhí)行腳本,如何實(shí)現(xiàn)?

解決方案:設(shè)置bootRun.dependsOn動態(tài)添加Flyway的依賴即可:

addFlywayDenpendency {
doLast {
dependencies {
compile('org.flywaydb:flyway-core:4.0.3')
}
}
}
bootRun.dependsOn=addFlywayDenpendency

若項(xiàng)目有多個團(tuán)隊(duì)同時開發(fā)不同的功能,需要新建多個分支,并且都會涉及到數(shù)據(jù)庫Schema更改,當(dāng)后期Merge時,Migration的版本如何控制并且不會產(chǎn)生數(shù)據(jù)庫更改的沖突呢?
解決方案:如果兩個分支的數(shù)據(jù)庫更改有沖突,要么最初數(shù)據(jù)庫設(shè)計(jì)不合理,要么目前數(shù)據(jù)庫更改不合理,所以需要團(tuán)隊(duì)進(jìn)行全局考慮和協(xié)調(diào)。而針對數(shù)據(jù)庫在同一段時間有修改,但不會造成沖突的情況,通常實(shí)際項(xiàng)目中主要存在這樣的情況,那可以設(shè)置flyway.out-of-order=true,這樣允許當(dāng)v1和v3已經(jīng)被應(yīng)用后,v2出現(xiàn)時同樣也可以被應(yīng)用。其實(shí)在本地使用內(nèi)存數(shù)據(jù)庫不會存在該問題,因?yàn)閿?shù)據(jù)庫所有對象會自動清除掉,而在local或dev中使用真實(shí)數(shù)據(jù)庫時可遇到這樣的問題,因此需要注意一下了。
另外,值得一提的是Flyway的參數(shù)ignore-failed-future-migration默認(rèn)為true,使用情形為:當(dāng)Rollback數(shù)據(jù)庫更改到舊版本,而metadata表中已存在了新版本時,F(xiàn)lyway會忽略此錯誤,只會顯示警告信息。

結(jié)束語

總得來說,F(xiàn)lyway可以有效改善數(shù)據(jù)庫版本管理方式,如果項(xiàng)目中還未使用,不防嘗試一下。如果有興趣,也可以關(guān)注MyBatis Migration,功能支持沒有Flyway多,屬于更輕量級的數(shù)據(jù)庫版本管理工具。如果在使用過程中遇到了問題或坑,歡迎留言一起交流討論。

References

Flyway Documentation

Gradle Plugin: Flyway

Spring Common application properties

Execute Flyway database migrations on startup

到此這篇關(guān)于快速掌握和使用Flyway的詳細(xì)教程的文章就介紹到這了,更多相關(guān)使用Flyway的技巧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 深入淺析java中flyway使用簡介
  • Spring Boot項(xiàng)目使用Flyway的詳細(xì)教程
  • Java 中Flyway的使用詳解
  • 淺談SpringBoot之開啟數(shù)據(jù)庫遷移的FlyWay使用
  • 詳解Spring Boot中使用Flyway來管理數(shù)據(jù)庫版本
  • Flyway的簡單介紹及使用詳解

標(biāo)簽:鄂爾多斯 莆田 哈爾濱 丹東 遵義 錫林郭勒盟 襄陽 雙鴨山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《快速掌握和使用Flyway的詳細(xì)教程》,本文關(guān)鍵詞  快速,掌握,和,使用,Flyway,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《快速掌握和使用Flyway的詳細(xì)教程》相關(guān)的同類信息!
  • 本頁收集關(guān)于快速掌握和使用Flyway的詳細(xì)教程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲欧美成人一区二区在线电影| 国产精品亚洲欧美在线播放| 免费无码毛片一区二区app| 久久久久无码国产精品一区李宗瑞| 香港日本韩国三级网站| 成人一级黄色片| 国产黄色一级网站| 国产精品www色诱视频| 一区二区视频免费在线观看| 国产爆乳无码一区二区麻豆| 午夜精品福利一区二区三区蜜桃| 久草在线视频福利| 日本免费在线视频不卡一不卡二| 成人av免费在线| 一色道久久88加勒比一| 日本不卡三区| 亚洲成人免费视| 天天操天天操天天干| 欧美精品一区二区三区免费播放| 欧美 日韩 综合| 国产女人18毛片18精品| 中文字幕中文字幕精品| 亚洲激情视频在线| 超碰在线公开| 午夜影院免费体验区| 乌克兰美女av| 男人添女人下部高潮视频在观看| 国产精品视频一区二区三区,| 91国偷自产中文字幕久久| 国产精品中文字幕欧美| 成人综合一区| 久久久久无码国产精品不卡| 北条麻妃一区二区三区中文字幕| 国产精品18在线| www.成人影院| 欧日韩在线视频| 一区二区三区四区| 中国黄色一级视频| 国产精品人人爱一区二区白浆| 秋霞成人午夜鲁丝一区二区三区| 成人av网站在线播放| 亚洲激情一区二区三区| 人人玩人人添人人澡免费| 色综合天天综合网国产成人网| 99re这里只有精品视频首页| 欧美又黄又嫩大片a级| 精品国内一区二区三区免费视频| 亚洲一区中文| 欧美一区二区三区……| 深夜黄色小视频| 成人羞羞视频免费看看| 亚洲r级在线视频| 最近中文字幕mv免费高清电影| 国产96在线亚洲| 能看毛片的网站| 最近2019年中文视频免费在线观看| 宅男视频免费在线观看视频| 色婷婷一区二区三区四区| 中文字幕亚洲成人| 国产丰满果冻videossex| 亚洲精品欧洲| 欧美激情免费看| 日韩黄色av网站| 一区二区电影网| 欧美黄色激情视频| 色香蕉久久蜜桃| 四虎永久在线高清国产精品| 精品国产乱码久久久久久郑州公司| 丁香啪啪综合成人亚洲| 天天草夜夜操| 国产一区二区免费在线观看| 福利视频网址导航| 欧美日韩精品免费观看视一区二区| 久久福利视频网| 自拍偷拍校园春色| 美女福利网站视频在线观看| 激情偷乱视频一区二区三区| www.国产在线| 天堂аⅴ在线地址8| 国产欧美一区二区精品婷婷| av网站在线观看不卡| 三级在线观看视频| a毛片在线免费观看| 欧美一区二区福利在线| av在线不卡观看免费观看| 韩日电影在线观看| 91蜜桃网站免费观看| 亚洲美女视频在线观看| 亚洲精品乱码久久久久久9色| 在线观看a级片| 女人被狂躁到高潮的免费| 国产成人精品视频在线| 日韩国产一区三区| 日韩一级免费片| 久久久久亚洲av无码网站| 男人添女人下部高潮视频在观看| 亚洲av无码乱码国产麻豆| 在线成人性视频| 污污影院在线观看| 欧美乱妇高清无乱码| 一区二区成人网| 伊人久久精品一区二区三区| 亚洲**毛片| 加勒比婷婷色综合久久| 亚洲视频网站在线观看| 亚洲欧美日韩综合aⅴ视频| 亚洲国产精品欧美久久| 亚洲精品电影久久久| 中国女人久久久| 国产成人一区二区三区| 国产视频第一页在线观看| 日韩一卡二卡三卡四卡| www.国产精品一区| 久久久久久久97| 国产精品人人爽人人做我的可爱| 天堂av资源在线| 91亚洲国产成人精品一区二三| 亚洲男人在线| 中文字幕在线中文字幕二区| 国产区在线观看视频| 成人福利资源| 久久久久久久免费视频| 亚洲激情 欧美| 亚洲国产网站| www91在线观看| 中文字幕第四页| 亚洲激情欧美| 日本精品一区| 夜夜春很很躁夜夜躁| 国产资源在线一区| 国产精品日本一区二区不卡视频| 97在线观看视频| 嫩草影院永久入口| 精品婷婷伊人一区三区三| 久久精品在线观看视频| 亚洲天堂av在线免费观看| 中文成人无字幕乱码精品区| 4444亚洲人成无码网在线观看| 黄色a级在线观看| 一区二区三区视频免费在线观看| 国产成人精品一区二三区在线观看| 亚洲一区二区图片| 欧美另类videos| 992tv在线观看免费进| 最近中文在线观看| 国产69久久精品成人看| 国产91久久久久蜜臀青青天草二| 影音先锋中文在线视频| 精品国产一区二区三区av性色| free性欧美16hd| 国产在线精彩视频| 久久精子c满五个校花| 蜜桃av中文字幕| 欧美一区二区综合| 91精彩视频在线播放| 91国内产香蕉| 黄色一级片视频| 永久免费无码av网站在线观看| chinese偷拍一区二区三区| 国产精品地址| 欧美日韩国产高清一区| 狠狠躁夜夜躁人人爽天天天天97| 亚洲在线中文字幕| 欧美日韩国产综合视频| 欧美精品一二三| 欧美一区二区精品在线| 欧美久草视频| 欧美在线三级电影| 欧美日韩亚洲第一页| 国产成人精品免费视频| 91精品一区二区三区综合| 91精品国模一区二区三区| 国模大尺度一区二区三区| 欧美性开放视频| 欧美性受xxx黑人xyx性爽| 91sa在线看| 午夜精品影视国产一区在线麻豆| 成人无码av片在线观看| 日韩不卡一区二区| 亚洲欧美久久久久| 男女一区二区三区| 一本大道久久a久久精品| 欧美精品情趣视频| 欧美福利视频网站| 麻豆精品在线| 欧美探花视频资源| 欧美日韩免费观看一区三区| 精品国产髙清在线看国产毛片| 日韩电影免费观看| 久久午夜福利电影| 日本xxx免费| 午夜影院韩国伦理在线| 欧美色图另类小说| 天天综合网网欲色| 亚洲AV无码精品色毛片浪潮| 国产婷婷一区二区三区| 日韩在线观看电影完整版高清免费悬疑悬疑| av在线免费在线观看| 日韩三级久久| 视频一区免费观看| 欧美成人aa大片| 日本精品视频一区二区| 欧美另类videos死尸| 久久er这里只有精品| 成人黄色激情网站| 精品一区二区三孕妇视频| 国产福利精品一区二区| 狂野欧美性猛交xxxxx视频| 男人天堂久久| 国产麻豆视频| 日日噜噜夜夜狠狠久久波多野| 国产精品无码无卡无需播放器| 国产精品7m视频| 91精品国产综合久久久久久豆腐| 天天躁日日躁狠狠躁av| 亚洲欧美国产一区二区三区| 偷偷看偷偷操| 欧美三级第一页| 欧美xxxx日本和非洲| 日本桃色视频| 在线免费观看日本欧美爱情大片| 人人干狠狠干| 中文字幕+乱码+中文乱码91| 国产精品毛片久久久久久久av| 风流少妇一区二区三区91| 欧美午夜理伦三级在线观看| 999国产精品视频| 国产精品久久久久久影院8一贰佰| 亚洲性视频网站| 成年午夜在线| 一区二区三区在线高清| 青娱乐自拍偷拍| 国产午夜精品视频免费不卡69堂| 最新的欧美黄色| 日本午夜一本久久久综合| 精品欧美一区二区在线观看视频| 国产精品乱人伦一区二区| 精品乱码一区二区三四区视频| 欧美黄色一区二区三区| 成人动漫在线一区| 国产精品a级| 伊人免费视频2| 在线观看日韩| 男女视频在线观看免费| 成人免费网站www网站高清| 天天干,天天操,天天射| 三级性生活视频| 欧美熟妇精品一区二区蜜桃视频| avtt天堂在线| japanese国产在线观看| 欧美日韩久久婷婷| 国产成年人在线观看| 日韩精品一区二区三区视频| 日本高清网站| 国产精品色婷婷久久58| 欧美福利在线播放网址导航| 成人在线看视频| 国产一区二区三区站长工具| 哺乳挤奶一区二区三区免费看| 欧美一卡2卡三卡4卡5免费| 成人黄网大全在线观看| 国内成人精品2018免费看| 91理论电影在线观看| 国产自摸综合网| 日本一区影院| 欧美激情视频给我| 黄瓜视频成人app免费| 国产免费一区二区视频| 中文字幕欧美在线| 农村一级毛片| av中文字幕在线播放| 欧美性猛交xxxx| www.亚洲一区二区| 久久久久久久久久久久国产精品| 久久这里只有精品6| 国内在线观看一区二区三区| 美女免费视频一区二区| 精品人妻午夜一区二区三区四区| 日韩在线视频免费看| 在线欧美小视频| 我不卡伦不卡影院| avtt天堂在线| 国产二级片在线观看| 中国大陆高清aⅴ毛片| 日韩av手机在线| 涩涩涩视频在线观看| 国产大学生粉嫩无套流白浆| 风间由美一区二区三区在线观看| 91高清视频免费| 国内精品久久久久久久果冻传媒| 亚洲精品福利资源站| 日本精品va在线观看| 日韩精品1区| 国产精品涩涩涩视频网站| 久草这里只有精品视频| 第一区第二区在线| 中文在线а√天堂官网| 都市激情国产精品| 黄色毛片视频| 四虎国产精品永久在线国在线| 欧美自拍丝袜亚洲| 在线观看h视频| 欧美三级日本三级少妇99| 国产免费视频| 国产夫绿帽单男3p精品视频| 免费黄网站在线观看| 你懂得视频网站| 欧美一站二站| 日韩激情在线播放| 情侣黄网站免费看| 亚洲欧美另类小说| 中文乱码字幕午夜无线观看| 国产乱人伦偷精品视频免下载| 天堂中文在线官网| 色欲av伊人久久大香线蕉影院| 欧美成人午夜剧场免费观看| 91精品国产综合久久久蜜臀图片| 成人午夜精品视频| 中文字幕国产亚洲| 乱馆动漫1~6集在线观看| 超碰在线人人| 精品国产乱码久久久久久免费| 久草精品在线播放| 日本中文字幕在线观看视频| 97在线视频一区| 国产日韩综合av| 日韩精品亚洲人成在线观看| 天堂av.com|