日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

flyway spring_关于使用Flyway在Spring Boot中管理数据更改的建议

發(fā)布時(shí)間:2023/12/20 javascript 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flyway spring_关于使用Flyway在Spring Boot中管理数据更改的建议 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

flyway spring

介紹 (Introduction)

Database migrations are essential for the development of an application to progress and scale in any meaningful way.

數(shù)據(jù)庫遷移對于應(yīng)用程序的開發(fā)以任何有意義的方式進(jìn)行和擴(kuò)展至關(guān)重要。

Among other things, migrations keep changes to the database recorded in version control, automated, stateful 1, and, perhaps most importantly, reproducible.

除此之外,移民最重要的, 可重復(fù)的不斷變化記錄在版本控制數(shù)據(jù)庫, 自動化,狀態(tài) 1,或許。

[1]: I’m not sure if stateful is a common term for this. For me, migrations being stateful means that looking at any database, you can tell what ‘state’ the database is in; that is, what migrations have been applied to it so far. Flyway accomplishes this by creating a history table to record all attempted migrations.

[1]:我不確定有狀態(tài)是否是通用術(shù)語。 對我來說,遷移是有狀態(tài)的,意味著查看任何數(shù)據(jù)庫,您就可以知道數(shù)據(jù)庫所在的“狀態(tài)”。 也就是說,到目前為止已對其應(yīng)用了哪些遷移。 Flyway通過創(chuàng)建一個(gè)歷史記錄表來記錄所有嘗試的遷移來實(shí)現(xiàn)此目的。

問題 (The Issue)

Photo by Arthur Yeti on Unsplash照片由Arthur Yeti在Unsplash上拍攝

While schema changes are “respected” enough by developers to be put into migrations, data changes are often not that lucky; data changes are more likely to be performed on an ad-hoc basis on individual environments.

盡管開發(fā)人員足夠尊重架構(gòu)更改以進(jìn)行遷移,但數(shù)據(jù)更改通常并不那么幸運(yùn)。 數(shù)據(jù)更改更有可能在個(gè)別環(huán)境中臨時(shí)執(zhí)行。

The downsides of such an approach are, in essence, the opposite of the migration approach’s benefits; these data changes are [often] not committed to version control, not part of the automated deployment pipeline, stateless 2, and hard to track and reproduce.

從本質(zhì)上講,這種方法的缺點(diǎn)與遷移方法的好處相反。 這些數(shù)據(jù)更改[通常]不致力于版本控制,不屬于自動部署管道的一部分,是無狀態(tài)的,并且難以跟蹤和再現(xiàn)。

These disadvantages are especially apparent when such data changes pertain to what’s often referred to as master data; that is, records that the application assumes, depends on, and might not have a graceful way of dealing with their absence. Such data may include user types (user, admin, etc…), content categories, or localization-related records, to name some.

當(dāng)此類數(shù)據(jù)更改與通常稱為主數(shù)據(jù)的內(nèi)容有關(guān)時(shí),這些缺點(diǎn)尤為明顯。 也就是說,應(yīng)用程序假定的記錄,依賴的記錄以及可能沒有適當(dāng)?shù)姆椒▉硖幚硭鼈兊娜笔А?這些數(shù)據(jù)可能包括用戶類型(用戶,管理員等),內(nèi)容類別或與本地化相關(guān)的記錄,僅舉幾例。

Data changes are as essential to the end result as the application code or schema changes and, thus, should be treated equally.

數(shù)據(jù)更改對于最終結(jié)果至關(guān)重要,就像應(yīng)用程序代碼或架構(gòu)更改一樣,因此應(yīng)同等對待。

[2]: In the sense that looking at the history table of migrations, there’s no way to tell if certain data changes were applied.

[2]:從查看遷移的歷史記錄表的意義上講,無法確定是否應(yīng)用了某些數(shù)據(jù)更改。

我們能做什么 (What We Can Do)

A quick workaround could be to commit any data changes done through SQL to a dedicated location in the codebase and apply them manually.

一種快速的解決方法是將通過SQL完成的所有數(shù)據(jù)更改提交到代碼庫中的專用位置,然后手動應(yīng)用它們。

While this is not precisely stateful or automatically reproducible, it does help to get such changes into version control and might make tracking and reproducing them a bit more manageable.

盡管這不是精確的有狀態(tài)或自動可復(fù)制的,但確實(shí)有助于將此類更改納入版本控制,并且可能使跟蹤和復(fù)制它們變得更易于管理。

But can we do better?

但是,我們可以做得更好嗎?

建議 (The Suggestion)

A cleaner approach would be to treat data changes similar to schema changes; as first-class database migrations. After all, data changes are as essential to the end result as the application code or schema changes and, thus, should be treated equally.

較干凈的方法是將數(shù)據(jù)更改與架構(gòu)更改類似地對待。 作為一流的數(shù)據(jù)庫遷移。 畢竟,數(shù)據(jù)更改對于最終結(jié)果至關(guān)重要,就像應(yīng)用程序代碼或架構(gòu)更改一樣,因此應(yīng)同等對待。

In the context of Flyway, this translates into putting data changes in SQL files alongside other migrations, either versioned or repeatable.

在Flyway的上下文中,這意味著將數(shù)據(jù)更改與其他遷移( 版本化或可重復(fù)的)一起放入SQL文件中。

Photo by William Rouse on Unsplash 威廉·羅斯 ( William Rouse)在Unsplash上拍攝

Flyway遷移速成課程 (A Crash Course on Flyway Migrations)

In Flyway, a versioned migration is one that 1- starts with a V, 2- gets applied once, and 3- cannot be modified after it’s been applied. This type is the most common and is often used for schema migrations.

在Flyway中, 版本化遷移是這樣的遷移:1從V開始,2被應(yīng)用一次,3被應(yīng)用后不能修改。 此類型是最常見的類型,通常用于架構(gòu)遷移。

A repeatable migration, on the other hand, is one that 1- starts with an R, 2- may be applied multiple times, and 3- can be modified after it’s been applied. This type is less know and is suggested for creating views, procedures, functions, etc.

另一方面, 可重復(fù)的遷移是這樣的遷移:1以R開頭,2可以被多次應(yīng)用,3可以在應(yīng)用后被修改。 這種類型鮮為人知,建議用于創(chuàng)建視圖,過程,函數(shù)等。

The challenge with repeatable migrations is writing the SQL code. Code in such migrations should be safe to rerun multiple times without producing unintended side effects such as erroring or duplicating records.

可重復(fù)遷移的挑戰(zhàn)在于編寫SQL代碼。 這樣的遷移中的代碼應(yīng)可以安全地重新運(yùn)行多次,而不會產(chǎn)生意外的副作用,例如錯(cuò)誤記錄或重復(fù)記錄。

共享數(shù)據(jù)遷移的選擇 (The Choice for Shared Data Migrations)

For shared data migrations across all environments, the choice is largely practical and personal.

對于跨所有環(huán)境的共享數(shù)據(jù)遷移,選擇主要是實(shí)際和個(gè)人的。

Writing versioned migrations means that your master data is potentially going to be split across multiple files with schema migration files in between. It does free you from having to write repeatable code, though.

編寫版本化的遷移意味著您的主數(shù)據(jù)可能會被拆分成多個(gè)文件,而架構(gòu)遷移文件將介于兩個(gè)文件之間。 但是,它使您不必編寫可重復(fù)的代碼。

On the other hand, writing repeatable migrations means that your master data can all sit in one file or a number of data files. It also means that data changes stay out of the way of, and are quite distinguishable from, schema changes. However, it does require you to write repeatable code (which for insert statements is quite manageable as we’ll see later for MySQL at least).

另一方面,編寫可重復(fù)的遷移意味著您的主數(shù)據(jù)可以全部放在一個(gè)文件或多個(gè)數(shù)據(jù)文件中。 這也意味著數(shù)據(jù)更改不影響模式更改,并且與模式更改完全不同。 但是,它確實(shí)需要您編寫可重復(fù)的代碼(對于插入語句,這是相當(dāng)可管理的,至少我們稍后將在MySQL上看到)。

針對特定環(huán)境的數(shù)據(jù)遷移的選擇 (The Choice for Environment-specific Data Migrations)

For data migrations that should only be applied to a specific environment (think test data for a test environment or dummy login credentials for dev), the same tradeoffs between versioned and repeatable migrations apply. However, versioned migrations have one more disadvantage in this case; environments other than the one receiving the versioned migration will seem to have “skipped” some versions.

對于僅應(yīng)應(yīng)用于特定環(huán)境的數(shù)據(jù)遷移(對于測試環(huán)境考慮測試數(shù)據(jù),對于開發(fā)人員則考慮虛擬登錄憑據(jù)),在版本化遷移和可重復(fù)遷移之間應(yīng)用相同的權(quán)衡。 但是,在這種情況下,版本化遷移還有另一個(gè)缺點(diǎn)。 除了接受版本化遷移的環(huán)境以外,其他環(huán)境似乎已經(jīng)“跳過”了某些版本。

Photo on foter.com foter.com上的照片

我的建議 (My Suggestion)

If I haven’t already given it away, I prefer repeatable migrations for all data changes to keep them visibly different, maintain continuous versioning for schema changes across all environments, and keep things consistent for both shared and environment-specific data migrations.

如果我還沒有放棄的話,我希望對所有數(shù)據(jù)更改進(jìn)行可重復(fù)的遷移,以使它們在視覺上保持不同,為所有環(huán)境中的架構(gòu)更改保持連續(xù)的版本控制,并使共享數(shù)據(jù)和特定于環(huán)境的數(shù)據(jù)遷移保持一致。

細(xì)節(jié) (The Details)

The specifics of how to, exactly, accomplish this suggestion for three environments; dev, staging, and prod in Spring Boot 2.x can be summarized as:

如何針對三種環(huán)境準(zhǔn)確實(shí)現(xiàn)此建議的細(xì)節(jié); Spring Boot 2.x中的 dev , staging和prod可以總結(jié)為:

1- Create the following properties files:* application.properties* application-non-prod.properties* application-dev.properties* application-staging.properties* application-prod.properties

1-創(chuàng)建以下屬性文件: * application.properties * application-non-prod.properties * application-dev.properties * application-staging.properties * application-prod.properties

2- Create the following directories at the classpath. In Spring Boot as you’re probably aware, anything under /src/main/resources is added to the classpath:* db/migration/shared* db/migration/non-prod* db/migration/dev* db/migration/staging* db/migration/prod

2-在類路徑下創(chuàng)建以下目錄 。 如您所知,在Spring Boot中, /src/main/resources都添加到類路徑中: * db / migration / shared * db / migration / non-prod * db / migration / dev * db / migration / staging * db /遷移/產(chǎn)品

3- In the properties file for each environment, override the spring.flyway.locations property, which accepts a comma-separated list of locations. In Spring Boot, the default location is db/migration.

3-在每個(gè)環(huán)境的屬性文件中,覆蓋spring.flyway.locations屬性,該屬性接受以逗號分隔的位置列表。 在Spring Boot中,默認(rèn)位置是db/migration 。

We want to modify the migrations locations in such a way that:dev reads migrations from the shared, non-prod, and dev directories.staging reads migrations from the shared, non-prod, and staging directories.prod reads migrations from the shared, and prod directories only.

我們希望以以下方式修改遷移位置: dev從shared , non-prod和dev目錄中讀取遷移。 staging從shared , non-prod和暫存目錄讀取遷移。 prod僅從shared和prod目錄讀取遷移。

This can be accomplished by setting the locations property as follows:

可以通過如下設(shè)置locations屬性來實(shí)現(xiàn):

* In application-dev.properties, set:

*在application-dev.properties ,設(shè)置:

spring.flyway.locations=classpath:/db/migration/shared,classpath:/db/migration/non-prod,classpath:/db/migration/dev

* In application-staging.properties , set:

*在application-staging.properties ,設(shè)置:

spring.flyway.locations=classpath:/db/migration/shared,classpath:/db/migration/non-prod,classpath:/db/migration/staging

* In application-prod.properties , set:

*在application-prod.properties ,設(shè)置:

spring.flyway.locations=classpath:/db/migration/shared,classpath:/db/migration/prod

4- For any database change, follow these conventions:* Is it a schema change? Create a versioned migration in the shared directory.* Is it a master data change? Create a repeatable migration or update an existing one in the shared directory.* Is it a data change that shouldn’t make its way to production but is ok on other environments? Create a repeatable migration or update an existing one in the non-prod directory.* Is it a data change specific to the dev, staging, or prod environment? Create a repeatable migration or update an existing one in the dev, staging, or prod directory, respectively.

4-對于任何數(shù)據(jù)庫更改,請遵循以下約定:*是架構(gòu)更改嗎? 在共享目錄中創(chuàng)建版本化的遷移。*是主數(shù)據(jù)更改嗎? 創(chuàng)建可重復(fù)的遷移或更新共享目錄中的現(xiàn)有遷移。*這是不應(yīng)該用于生產(chǎn)但在其他環(huán)境中還可以的數(shù)據(jù)更改嗎? 創(chuàng)建可重復(fù)的遷移或更新非生產(chǎn)目錄中的現(xiàn)有遷移。*這是特定于dev , staging或prod環(huán)境的數(shù)據(jù)更改嗎? 在dev , staging或prod目錄中分別創(chuàng)建可重復(fù)的遷移或更新現(xiàn)有的遷移。

Photo on foter.com foter.com上的照片

一個(gè)示例實(shí)現(xiàn) (An Example Implementation)

To create a minimal application to test this setup, we can start with an empty Spring Boot project with at least the following dependencies; spring-boot-starter-web, spring-boot-starter-data-jpa, flyway-core, and mysql-connector-java and walk through the following steps 3:

為了創(chuàng)建一個(gè)最小的應(yīng)用程序來測試該設(shè)置,我們可以從一個(gè)空的Spring Boot項(xiàng)目開始,該項(xiàng)目至少具有以下依賴性: spring-boot-starter-web , spring-boot-starter-data-jpa , flyway-core和mysql-connector-java并完成以下步驟3:

1- Make sure you have a MySQL server running locally on the default port 3306 with a username of root and no password or change values across this tutorial according to your individual setup.

1-確保您的MySQL服務(wù)器在默認(rèn)端口3306上本地運(yùn)行,用戶名root ,沒有密碼,或者根據(jù)您的個(gè)人設(shè)置在本教程中更改值。

1.1- Access the MySQL server:

1.1-訪問MySQL服務(wù)器:

mysql -u root

1.2- Then create the dev, staging, and prod databases with:

1.2-然后使用以下命令創(chuàng)建dev , staging和prod數(shù)據(jù)庫:

CREATE DATABASE managing_flyway_migrations_dev;
CREATE DATABASE managing_flyway_migrations_staging;
CREATE DATABASE managing_flyway_migrations_prod;

2- Create properties files under /src/main/resources.2.1- Create a file called application.properties with the following content:

2-在/src/main/resources下創(chuàng)建屬性文件.2.1-創(chuàng)建一個(gè)名為application.properties的文件,其內(nèi)容如下:

spring.jpa.open-in-view=false# Change this value to 1.2 for the Third Run or remove all together
spring.flyway.target=1.1

2.2- Create an empty file called application-non-prod.properties .3

2.2-創(chuàng)建一個(gè)名為application-non-prod.properties的空文件。

2.3- Create a file called application-dev.properties with the following content:

2.3-創(chuàng)建一個(gè)名為application-dev.properties的文件,其內(nèi)容如下:

spring.profiles.include=non-prodserver.port=8081spring.datasource.url=jdbc:mysql://localhost:3306
spring.datasource.username=root
spring.datasource.password=
spring.datasource.name=managing_flyway_migrations_devspring.flyway.locations=classpath:/db/migration/shared,classpath:/db/migration/non-prod,classpath:/db/migration/dev
spring.flyway.schemas=${spring.datasource.name}

2.4- Create a file called application-staging.properties with the following content:

2.4-創(chuàng)建一個(gè)名為application-staging.properties的文件,其內(nèi)容如下:

spring.profiles.include=non-prodserver.port=8082spring.datasource.url=jdbc:mysql://localhost:3306
spring.datasource.username=root
spring.datasource.password=
spring.datasource.name=managing_flyway_migrations_stagingspring.flyway.locations=classpath:/db/migration/shared,classpath:/db/migration/non-prod,classpath:/db/migration/staging
spring.flyway.schemas=${spring.datasource.name}

2.5- Create a file called application-prod.properties with the following content:

2.5-創(chuàng)建一個(gè)名為application-prod.properties的文件,其內(nèi)容如下:

server.port=8083spring.datasource.url=jdbc:mysql://localhost:3306
spring.datasource.username=root
spring.datasource.password=
spring.datasource.name=managing_flyway_migrations_prodspring.flyway.locations=classpath:/db/migration/shared,classpath:/db/migration/prod
spring.flyway.schemas=${spring.datasource.name}

3- Create the migrations files under src/main/resources/db/migration.3.1- Under shared, create a file called V1_1__Initial_Schema.sql with the following content:

3-在src/main/resources/db/migration下創(chuàng)建遷移文件.3.1-在shared ,創(chuàng)建一個(gè)名為V1_1__Initial_Schema.sql的文件,其內(nèi)容如下:

CREATE TABLE roles (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(100),PRIMARY KEY (id)
);CREATE TABLE users (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
role_id BIGINT NOT NULL,PRIMARY KEY (id),FOREIGN KEY (role_id) REFERENCES roles (id)
);CREATE TABLE content_categories (
id BIGINT NOT NULL,
name VARCHAR(255) NOT NULL,PRIMARY KEY (id)
);CREATE TABLE content (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
category_id BIGINT NOT NULL,PRIMARY KEY (id),FOREIGN KEY (category_id) REFERENCES content_categories(id)
);

3.2- Under shared, create a file called V1_2__Add_content_topic.sql with the following content:

3.2-在shared ,創(chuàng)建一個(gè)名為V1_2__Add_content_topic.sql的文件,其內(nèi)容如下:

CREATE TABLE content_topics (
id BIGINT NOT NULL,
name VARCHAR(255) NOT NULL,PRIMARY KEY (id)
);ALTER TABLE content
ADD COLUMN topic_id BIGINT,
ADD CONSTRAINT FOREIGN KEY (topic_id) REFERENCES content_topics(id);

3.3- Under shared, create a file called R__1_Master_Data.sql with the following content:

3.3-在shared ,創(chuàng)建一個(gè)名為R__1_Master_Data.sql的文件,其內(nèi)容如下:

INSERT INTO
roles (id, name)
VALUES (1, 'System'), (2, 'Admin'), (3, 'User')
ON DUPLICATE KEY UPDATE id=id, name=VALUES(`name`);INSERT INTO
content_categories (id, name)
VALUES (1, 'Category 1'), (2, 'Category 2')
ON DUPLICATE KEY UPDATE id=id, name=VALUES(`name`);# INSERT statements for the First Run
# Comment out for the Third Run
####################################################################
INSERT INTO
content (id, name, category_id)
VALUES (1, 'Content 1.1', 1), (2, 'Content 1.2', 1),
(3, 'Content 2.1', 2), (4, 'Content 2.2', 2)
ON DUPLICATE KEY UPDATE id=id, name=VALUES(`id`), category_id=VALUES(`category_id`);
##################################################################### INSERT statements for the Third Run
# Uncomment for the Third Run
####################################################################
# INSERT INTO
# content_topics (id, name)
# VALUES (1, 'Topic 1'), (2, 'Topic 2')
# ON DUPLICATE KEY UPDATE id=id, name=VALUES(`name`);
#
# INSERT INTO
# content (id, name, category_id, topic_id)
# VALUES (1, 'Content 1.1', 1, 1), (2, 'Content 1.2', 1, 2),
# (3, 'Content 2.1', 2, 2), (4, 'Content 2.2', 2, 1)
# ON DUPLICATE KEY UPDATE id=id, name=VALUES(`name`), category_id=VALUES(`category_id`), topic_id=VALUES(`topic_id`);
####################################################################

Note: Notice that this migration starts with an R. This is what makes it a repeatable migration.

注意 :請注意,此遷移以R.開頭R.這就是使其成為可重復(fù)遷移的原因。

Note 2: Notice that the number in the name of the migration is neither necessary nor does it mean a specific version. I’m using numbers in the description of data migrations simply to order their execution. Flyway executes versioned migrations according to their versions first, then repeatable migrations alphabetically according to their descriptions.

注2 :請注意,遷移名稱中的數(shù)字既不是必需的,也不表示特定版本。 我在數(shù)據(jù)遷移的描述中使用數(shù)字只是為了命令執(zhí)行。 Flyway首先根據(jù)其版本執(zhí)行版本化的遷移,然后根據(jù)其描述按字母順序執(zhí)行可重復(fù)的遷移。

3.4- Under non-prod, create a file called R__2_Non_prod_login.sql with the following content:

3.4-在non-prod ,創(chuàng)建一個(gè)名為R__2_Non_prod_login.sql的文件,其內(nèi)容如下:

INSERT INTO
users (id, name, role_id)
VALUES (201, 'SuperAdmin', 1)
ON DUPLICATE KEY UPDATE id=id, name=VALUES(`name`), role_id=VALUES(`role_id`);

3.5- Under dev, create a file called R__3_Dev_login.sql with the following content:

3.5-在dev之下,創(chuàng)建一個(gè)名為R__3_Dev_login.sql的文件,其內(nèi)容如下:

INSERT INTO
users (id, name, role_id)
VALUES (301, 'Developer 1', 2), (302, 'Developer 2', 2)
ON DUPLICATE KEY UPDATE id=id, name=VALUES(`name`), role_id=VALUES(`role_id`);

3.6- Under staging, create a file called R__3_Staging_login.sql with the following content:

3.6-在staging ,創(chuàng)建一個(gè)名為R__3_Staging_login.sql的文件,其內(nèi)容如下:

INSERT INTO
users (id, name, role_id)
VALUES (301, 'QA 1', 3), (302, 'QA 2', 3)
ON DUPLICATE KEY UPDATE id=id, name=VALUES(`name`), role_id=VALUES(`role_id`);

By now, we have all the code and configurations we need for our first run.

到現(xiàn)在為止,我們已經(jīng)擁有了第一次運(yùn)行所需的所有代碼和配置。

Photo by Fabio Comparelli on Unsplash Fabio Comparelli在Unsplash上拍攝的照片

第一次運(yùn)行 (First Run)

In this first run, we’ll execute the 1.1 versioned migration alongside the other repeated ones to simulate a deployment with the initial database schema and data.

在第一次運(yùn)行中,我們將與其他重復(fù) 版本一起執(zhí)行1.1 版本的遷移,以模擬具有初始數(shù)據(jù)庫架構(gòu)和數(shù)據(jù)的部署。

The two important locations to differentiate between runs in these tests are the Flyway target in application.properties and the INSERT statements in R__1_Master_Data.sql. If you’re using the accompanying GitHub repository, make sure you’re on the first-run branch.

在這些測試運(yùn)行之間的區(qū)分這兩個(gè)重要的位置是在遷飛目標(biāo)application.properties ,并在INSERT語句R__1_Master_Data.sql 。 如果您使用隨附的GitHub存儲庫,請確保您位于first-run分支。

測試`dev`配置文件 (Testing the `dev` Profile)

Run the application with the dev profile active:

在dev配置文件處于活動狀態(tài)的情況下運(yùn)行應(yīng)用程序:

mvn spring-boot:run -Dspring.profiles.active=dev

By now, we expect a number of things:* The versioned migration V1_1__Initial_Schema.sql was applied.* The versioned migration V1_2__Add_content_topic.sql was not applied (since we have the target set to 1.1).* The shared repeated migration R__1_Master_Data.sql was applied.* The non-prod repeated migration R__2_Non_prod_login.sql was applied.* The dev repeated migration R__3_Dev_login.sql was applied.

到目前為止,我們期望發(fā)生以下事情:*應(yīng)用了版本化的遷移V1_1__Initial_Schema.sql 。*沒有應(yīng)用版本化的遷移V1_2__Add_content_topic.sql (因?yàn)槲覀儗⒛繕?biāo)設(shè)置為1.1 )。*共享的重復(fù)遷移R__1_Master_Data.sql是*已應(yīng)用非產(chǎn)品重復(fù)遷移R__2_Non_prod_login.sql 。*已應(yīng)用dev 重復(fù)遷移R__3_Dev_login.sql 。

Use the Dev Database

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

USE managing_flyway_migrations_dev;

Check the History Table

查看歷史記錄表

To verify this, we check the flyway_schema_history that Flyway would’ve created by running the following inside our database server:

為了驗(yàn)證這一點(diǎn),我們檢查flyway_schema_history 可以通過在數(shù)據(jù)庫服務(wù)器內(nèi)部運(yùn)行以下命令來創(chuàng)建:

SELECT installed_rank, version, description, success FROM flyway_schema_history;

The output of the SELECT statement above should look as follows:

上面的SELECT語句的輸出應(yīng)如下所示:

+----------------+---------+------------------+---------+
| installed_rank | version | description | success |
+----------------+---------+------------------+---------+
| 1 | 1.1 | Initial Schema | 1 |
| 2 | NULL | 1 Master Data | 1 |
| 3 | NULL | 2 Non prod login | 1 |
| 4 | NULL | 3 Dev login | 1 |
+----------------+---------+------------------+---------+

Check the Content Table

檢查內(nèi)容表

The content table should contain the records we inserted in the Master Data as follows:

內(nèi)容表 應(yīng)該包含我們插入到主數(shù)據(jù)中的記錄,如下所示:

SELECT * FROM content;

This should output:

這應(yīng)該輸出:

+----+-------------+-------------+
| id | name | category_id |
+----+-------------+-------------+
| 1 | Content 1.1 | 1 |
| 2 | Content 1.2 | 1 |
| 3 | Content 2.1 | 2 |
| 4 | Content 2.2 | 2 |
+----+-------------+-------------+

Check the Users Table

檢查用戶表

In the users table, we should see records from both the Non-production Login (SuperAdmin) as well as the Dev Login migrations we defined. Run the command:

在用戶表中,我們應(yīng)該看到非生產(chǎn)登錄 (SuperAdmin)以及我們定義的開發(fā)登錄的遷移記錄。 運(yùn)行命令:

SELECT * FROM users;

This should output:

這應(yīng)該輸出:

+-----+-------------+---------+
| id | name | role_id |
+-----+-------------+---------+
| 201 | SuperAdmin | 1 |
| 301 | Developer 1 | 2 |
| 302 | Developer 2 | 2 |
+-----+-------------+---------+

I leave testing the staging profile to the reader as it’s almost identical to the tests described in this section.

我將測試staging配置文件留給讀者,因?yàn)樗鼛缀跖c本節(jié)中描述的測試相同。

Now, let’s move on to testing production!

現(xiàn)在,讓我們繼續(xù)測試生產(chǎn)!

測試` prod配置文件 (Testing the `prod` Profile)

Run the application with the prod profile active:

在prod配置文件處于活動狀態(tài)的情況下運(yùn)行應(yīng)用程序:

mvn spring-boot:run -Dspring.profiles.active=prod

By now, we expect a number of things:* The versioned migration V1_1__Initial_Schema.sql was applied.* The versioned migration V1_2__Add_content_topic.sql was not applied.* The shared repeated migration R__1_Master_Data.sql was applied.

到現(xiàn)在為止,我們期待一些事情:*本版本遷移V1_1__Initial_Schema.sql 。應(yīng)用*的版本控制的遷移V1_2__Add_content_topic.sql 。不適用*共享重復(fù)遷移R__1_Master_Data.sql應(yīng)用。

Use the Prod Database

使用產(chǎn)品數(shù)據(jù)庫

USE managing_flyway_migrations_prod;

Check the History Table

查看歷史記錄表

To verify this, we check the flyway_schema_history that Flyway would’ve created by running the following inside our database server:

為了驗(yàn)證這一點(diǎn),我們檢查flyway_schema_history 可以通過在數(shù)據(jù)庫服務(wù)器內(nèi)部運(yùn)行以下命令來創(chuàng)建:

SELECT installed_rank, version, description, success FROM flyway_schema_history;

The output of the SELECT statement above should look as follows:

上面的SELECT語句的輸出應(yīng)如下所示:

+----------------+---------+----------------+---------+
| installed_rank | version | description | success |
+----------------+---------+----------------+---------+
| 1 | 1.1 | Initial Schema | 1 |
| 2 | NULL | 1 Master Data | 1 |
+----------------+---------+----------------+---------+

Notice that in production, we don’t have any of the test credentials defined in non-prod, dev, or staging.

請注意,在生產(chǎn)環(huán)境中,我們沒有在非生產(chǎn),開發(fā)或暫存中定義的任何測試憑據(jù)。

Check the Content Table

檢查內(nèi)容表

The content table should contain the records we inserted in the Master Data similar to what we saw in dev:

內(nèi)容表 應(yīng)該包含我們插入到主數(shù)據(jù)中的記錄,類似于在dev看到的記錄:

SELECT * FROM content;

This should output:

這應(yīng)該輸出:

+----+-------------+-------------+
| id | name | category_id |
+----+-------------+-------------+
| 1 | Content 1.1 | 1 |
| 2 | Content 1.2 | 1 |
| 3 | Content 2.1 | 2 |
| 4 | Content 2.2 | 2 |
+----+-------------+-------------+

Check the Users Table

檢查用戶表

The users table should be empty:

用戶表應(yīng)為空:

SELECT * FROM users;

This should output:

這應(yīng)該輸出:

Empty set (0.00 sec)Photo by Chander R on Unsplash Chander R在Unsplash上的照片

第二次跑 (Second Run)

In this run, we simulate an application restart or a deployment that contains no migration changes. Here, we’re really testing Flyway’s behavior.

在此運(yùn)行中,我們模擬應(yīng)用程序重新啟動或不包含任何遷移更改的部署。 在這里,我們正在測試Flyway的行為。

測試`dev`配置文件 (Testing the `dev` Profile)

Stop and rerun the dev application:

停止并重新運(yùn)行dev應(yīng)用程序:

mvn spring-boot:run -Dspring.profiles.active=dev

測試` prod配置文件 (Testing the `prod` Profile)

Stop and rerun the prod application as well:

也停止并重新運(yùn)行prod應(yīng)用程序:

mvn spring-boot:run -Dspring.profiles.active=prod

結(jié)果 (Results)

In the stream of logs that Spring generates in each run, look for a line containing the following:

在Spring每次運(yùn)行中生成的日志流中,查找包含以下內(nèi)容的行:

Schema `managing_flyway_migrations_dev` is up to date. No migration necessary.

This tells us that Flyway detected that no changes were made to the migrations, and therefore it took no action. Notice that even repeatable migrations were’s re-applied by Flyway; this is because the files, and therefore their checksums, didn’t change.

這告訴我們Flyway檢測到未對遷??移進(jìn)行任何更改,因此未采取任何措施。 請注意, Flyway甚至重新應(yīng)用了可重復(fù)的遷移。 這是因?yàn)槲募捌湫r?yàn)和沒有發(fā)生變化。

Feel free to explore records in the tables after the restart to verify that nothing actually changed before moving on to the Third Run.

重新啟動后,請隨意瀏覽表中的記錄,以確保在進(jìn)行第三次運(yùn)行之前沒有任何實(shí)際更改。

Andrew Tanglao on 安德魯·唐勞 ( UnsplashUnderlash)

第三輪 (Third Run)

Now, let’s simulate a deployment with changes made to both versioned and repeatable migrations.

現(xiàn)在,讓我們模擬對版本化遷移和可重復(fù)遷移所做的更改的部署。

In the application.propertiesfile, change the spring.flyway.target property to 1.2 or delete it altogether. This will cause Flyway to apply the second versioned migration we have; V1_2__Add_content_topic.sql.

在application.properties文件中,將spring.flyway.target屬性更改為1.2或?qū)⑵渫耆珓h除。 這將導(dǎo)致Flyway應(yīng)用我們擁有的第二個(gè)版本化的遷移; V1_2__Add_content_topic.sql 。

In the R__1_Master_Data.sql, comment out the block for the First Run, and uncomment the one for the Third Run, as mentioned. Notice that in an actual application, you’d really be modifying the existing code instead of the commenting stuff.

R__1_Master_Data.sql ,在R__1_Master_Data.sql ,注釋掉“ 第一次運(yùn)行”的塊,并取消注釋“ 第三次運(yùn)行”的塊。 注意,在實(shí)際的應(yīng)用程序中,您實(shí)際上是在修改現(xiàn)有代碼,而不是注釋內(nèi)容。

If you’re using the GitHub repository, simply checkout the third-run branch.

如果您使用的是GitHub存儲庫,只需簽出third-run分支。

測試`dev`配置文件 (Testing the `dev` Profile)

Similar to the previous steps, stop and rerun the dev application:

與前面的步驟類似,停止并重新運(yùn)行dev應(yīng)用程序:

mvn spring-boot:run -Dspring.profiles.active=dev

By now, we expect a number of things:* The versioned migration V1_1__Initial_Schema.sql was not re-applied.* The versioned migration V1_2__Add_content_topic.sql was applied.* The shared repeated migration R__1_Master_Data.sql was re-applied (since it was changed).* The non-prod repeated migration R__2_Non_prod_login.sql was not re-applied (since it was not changed).* The dev repeated migration R__3_Dev_login.sql was not re-applied.

到現(xiàn)在為止,我們期待一些事情:*的版本控制的遷移V1_1__Initial_Schema.sql 。 沒有重新申請*的版本控制的遷移V1_2__Add_content_topic.sql 。應(yīng)用*共享重復(fù)遷移R__1_Master_Data.sql被重新應(yīng)用(因?yàn)樗桓淖?。* 重新應(yīng)用非產(chǎn)品重復(fù)遷移R__2_Non_prod_login.sql (因?yàn)槲锤?。* 重新應(yīng)用開發(fā)人員重復(fù)遷移R__3_Dev_login.sql 。

Use the Dev Database

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

USE managing_flyway_migrations_dev;

Check the History Table

查看歷史記錄表

Similar to the previous tests, run:

與先前的測試類似,運(yùn)行:

SELECT installed_rank, version, description, success FROM flyway_schema_history;

The output of the SELECT statement above should look as follows:

上面的SELECT語句的輸出應(yīng)如下所示:

+----------------+---------+-------------------+---------+
| installed_rank | version | description | success |
+----------------+---------+-------------------+---------+
| 1 | 1.1 | Initial Schema | 1 |
| 2 | NULL | 1 Master Data | 1 |
| 3 | NULL | 2 Non prod login | 1 |
| 4 | NULL | 3 Dev login | 1 |
| 5 | 1.2 | Add content topic | 1 |
| 6 | NULL | 1 Master Data | 1 |
+----------------+---------+-------------------+---------+

Notice the 1.2 versioned migration at the rank 5 as well as the re-application of the modified Master Data migration at 6.

注意排名5的1.2 版本遷移以及重新應(yīng)用修改后的Master Data遷移6 。

Check the Content Table

檢查內(nèi)容表

The content table should contain the records we inserted in the modified Master Data, including the new topic_id column introduced by the new migrations:

內(nèi)容表 應(yīng)包含我們在修改后的主數(shù)據(jù)中插入的記錄,包括新遷移引入的新topic_id列:

SELECT * FROM content;

This should output:

這應(yīng)該輸出:

+----+-------------+-------------+----------+
| id | name | category_id | topic_id |
+----+-------------+-------------+----------+
| 1 | Content 1.1 | 1 | 1 |
| 2 | Content 1.2 | 1 | 2 |
| 3 | Content 2.1 | 2 | 2 |
| 4 | Content 2.2 | 2 | 1 |
+----+-------------+-------------+----------+

Check the Users Table

檢查用戶表

The users table wouldn’t have changed since the last run:

自上次運(yùn)行以來, users表不會更改:

SELECT * FROM users;

This should output:

這應(yīng)該輸出:

+-----+-------------+---------+
| id | name | role_id |
+-----+-------------+---------+
| 201 | SuperAdmin | 1 |
| 301 | Developer 1 | 2 |
| 302 | Developer 2 | 2 |
+-----+-------------+---------+

測試` prod配置文件 (Testing the `prod` Profile)

Similarly, stop and rerun the prod application:

同樣,停止并重新運(yùn)行prod應(yīng)用程序:

mvn spring-boot:run -Dspring.profiles.active=prod

By now, we expect the following:* The versioned migration V1_1__Initial_Schema.sql was not re-applied.* The versioned migration V1_2__Add_content_topic.sql was applied.* The shared repeated migration R__1_Master_Data.sql was re-applied.

到現(xiàn)在為止,我們預(yù)計(jì)如下:*的版本控制的遷移V1_1__Initial_Schema.sql 沒有再次應(yīng)用*的版本控制的遷移。 V1_2__Add_content_topic.sql應(yīng)用*共享重復(fù)遷移。 R__1_Master_Data.sql被重施。

Use the Prod Database

使用產(chǎn)品數(shù)據(jù)庫

USE managing_flyway_migrations_prod;

Check the History Table

查看歷史記錄表

Two new records should show in the flyway_schema_historytable:

兩個(gè)新記錄應(yīng)顯示在flyway_schema_history表中:

SELECT installed_rank, version, description, success FROM flyway_schema_history;

The output of the SELECT statement above should look as follows:

上面的SELECT語句的輸出應(yīng)如下所示:

+----------------+---------+-------------------+---------+
| installed_rank | version | description | success |
+----------------+---------+-------------------+---------+
| 1 | 1.1 | Initial Schema | 1 |
| 2 | NULL | 1 Master Data | 1 |
| 3 | 1.2 | Add content topic | 1 |
| 4 | NULL | 1 Master Data | 1 |
+----------------+---------+-------------------+---------+

Check the Content Table

檢查內(nèi)容表

Similar to dev, the content records should contain the new topic_id column:

與dev類似, 內(nèi)容記錄應(yīng)包含新的topic_id列:

SELECT * FROM content;

This should output:

這應(yīng)該輸出:

+----+-------------+-------------+----------+
| id | name | category_id | topic_id |
+----+-------------+-------------+----------+
| 1 | Content 1.1 | 1 | 1 |
| 2 | Content 1.2 | 1 | 2 |
| 3 | Content 2.1 | 2 | 2 |
| 4 | Content 2.2 | 2 | 1 |
+----+-------------+-------------+----------+

Check the Users Table

檢查用戶表

The users table should still be empty:

用戶表仍應(yīng)為空:

SELECT * FROM users;

This should output:

這應(yīng)該輸出:

Empty set (0.00 sec)Photo by Aw Creative on Unsplash圖片由Aw Creative在Unsplash上拍攝

干凈運(yùn)行 (Clean Run)

Finally, let’s simulate a fresh installation of the application at this stage. This simulates how migrations would work in a fresh environment with an empty database or when the project is freshly set up on a new local development machine.

最后,讓我們在此階段模擬該應(yīng)用程序的全新安裝。 這模擬了遷移如何在具有空數(shù)據(jù)庫的新環(huán)境中工作,或者何時(shí)在新的本地開發(fā)計(jì)算機(jī)上新設(shè)置了項(xiàng)目。

Let’s use the staging environment here for a change. We’ll pretend that we’re just now setting up staging with the current code and a fresh database:

讓我們在這里使用staging環(huán)境進(jìn)行更改。 我們假裝我們現(xiàn)在正在使用當(dāng)前代碼和一個(gè)新數(shù)據(jù)庫來設(shè)置staging :

DROP DATABASE managing_flyway_migrations_staging;
CREATE DATABASE managing_flyway_migrations_staging;

Now run the staging application:

現(xiàn)在運(yùn)行staging應(yīng)用程序:

mvn spring-boot:run -Dspring.profiles.active=staging

By this, we expect the following:* The versioned migration V1_1__Initial_Schema.sql was applied.* The versioned migration V1_2__Add_content_topic.sql was applied.* The shared repeated migration R__1_Master_Data.sql was applied.* The non-prod repeated migration R__2_Non_prod_login.sql was applied.* The staging repeated migration R__3_Staging_login.sql was applied.

這樣,我們期望滿足以下條件:*應(yīng)用了版本化的遷移V1_1__Initial_Schema.sql 。*應(yīng)用了版本化的遷移V1_2__Add_content_topic.sql 。*應(yīng)用了共享的 重復(fù)遷移R__1_Master_Data.sql 。* 非產(chǎn)品 重復(fù)遷移R__2_Non_prod_login.sql被應(yīng)用了。 *已應(yīng)用分段 重復(fù)遷移R__3_Staging_login.sql 。

Use the Staging Database

使用登臺數(shù)據(jù)庫

USE managing_flyway_migrations_staging;

Check the History Table

查看歷史記錄表

Two new records should show in the flyway_schema_historytable:

兩個(gè)新記錄應(yīng)顯示在flyway_schema_history表中:

SELECT installed_rank, version, description, success FROM flyway_schema_history;

The output of the SELECT statement above should look as follows:

上面的SELECT語句的輸出應(yīng)如下所示:

+----------------+---------+-------------------+---------+
| installed_rank | version | description | success |
+----------------+---------+-------------------+---------+
| 1 | 1.1 | Initial Schema | 1 |
| 2 | 1.2 | Add content topic | 1 |
| 3 | NULL | 1 Master Data | 1 |
| 4 | NULL | 2 Non prod login | 1 |
| 5 | NULL | 3 Staging login | 1 |
+----------------+---------+-------------------+---------+

Note: Notice that the Master Data migration is applied once. Also, notice that this works fine because repeated migrations are always run after all versioned migrations have been applied.

注意 :請注意, 主數(shù)據(jù)遷移僅應(yīng)用一次。 此外,請注意,此方法的效果很好,因?yàn)?strong>在應(yīng)用 所有 版本化的遷移始終會重復(fù)運(yùn)行遷移。

Check the Content Table

檢查內(nèi)容表

The content table should already have all changes, including the topic_id column:

內(nèi)容表應(yīng)該已經(jīng)進(jìn)行了所有更改,包括topic_id列:

SELECT * FROM content;

This should output:

這應(yīng)該輸出:

+----+-------------+-------------+----------+
| id | name | category_id | topic_id |
+----+-------------+-------------+----------+
| 1 | Content 1.1 | 1 | 1 |
| 2 | Content 1.2 | 1 | 2 |
| 3 | Content 2.1 | 2 | 2 |
| 4 | Content 2.2 | 2 | 1 |
+----+-------------+-------------+----------+

Check the Users Table

檢查用戶表

The users table should have records from both the Non-production Login and Staging Login migrations:

users表應(yīng)該具有非生產(chǎn)登錄和暫存登錄遷移的記錄:

SELECT * FROM users;

This should output:

這應(yīng)該輸出:

+-----+------------+---------+
| id | name | role_id |
+-----+------------+---------+
| 201 | SuperAdmin | 1 |
| 301 | QA 1 | 3 |
| 302 | QA 2 | 3 |
+-----+------------+---------+

代碼 (The Code)

If you’d like a test drive with minimal effort, I’ve put together the same setup handy on GitHub: https://github.com/sayadi/managing-flyway-migrations-spring-boot.

如果您想以最小的努力進(jìn)行測試,我可以在GitHub上方便地進(jìn)行相同的設(shè)置: https : //github.com/sayadi/managing-flyway-migrations-spring-boot 。

最后的話 (A Final Word)

While this setup works, it is something I dreamt up for this article as a solution to a repeated problem I see. However, we haven’t had a chance to test this on a production application yet.

盡管此設(shè)置有效,但我為本文構(gòu)想的是作為我遇到的重復(fù)問題的解決方案。 但是,我們還沒有機(jī)會在生產(chǎn)應(yīng)用程序上對此進(jìn)行測試。

If you do end up using it in a real setup, do let me know in the comments below what works for you, what doesn’t, and what changes you might have had to do. Thanks for reading!

如果您確實(shí)要在實(shí)際設(shè)置中使用它,請?jiān)谙旅娴脑u論中讓我知道什么對您有用,什么不起作用以及您可能需要進(jìn)行哪些更改。 謝謝閱讀!

翻譯自: https://levelup.gitconnected.com/a-suggestion-on-managing-data-changes-in-spring-boot-using-flyway-b87cf87f8e88

flyway spring

總結(jié)

以上是生活随笔為你收集整理的flyway spring_关于使用Flyway在Spring Boot中管理数据更改的建议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲欧洲视频 | 91av中文 | 久久久一本精品99久久精品66 | 午夜精品久久久久久久99 | 99精品视频在线观看视频 | 欧美日韩国产综合一区二区 | 欧美日韩不卡一区二区 | 久久精品国产精品亚洲 | 在线精品观看 | 久久久久久久久久久久99 | 欧美久久久久久久久中文字幕 | 天天做日日爱夜夜爽 | 国产精品一区二区三区视频免费 | 国产精品高清免费在线观看 | 精品视频在线观看 | 正在播放国产一区 | 国产一区二区在线播放视频 | 久久久久免费精品国产小说色大师 | 日韩av在线一区二区 | 亚洲精品小视频在线观看 | 超碰人人乐 | 久久精品国产一区二区三 | 中文在线a√在线 | 国产精品久久久久久99 | 国产淫片免费看 | 免费麻豆网站 | 麻豆成人精品视频 | 久久久噜噜噜久久久 | 国产精品自产拍在线观看 | 最新av免费在线观看 | 91成年人网站 | 日本中文字幕系列 | 欧美综合色在线图区 | 四虎影视久久久 | 激情婷婷丁香 | 久草视频在线观 | 免费黄色网止 | 丁香在线观看完整电影视频 | 久久伊人国产精品 | 久草在线免 | 毛片美女网站 | 在线免费成人 | 在线日韩一区 | 国产中文字幕av | 午夜精品久久久久久 | 在线www色| 中文字幕日韩在线播放 | 最近中文字幕免费视频 | 9999在线| 91女神的呻吟细腰翘臀美女 | 亚洲精品视频在线观看免费视频 | 亚洲精品网站 | 在线精品视频在线观看高清 | 日韩精品不卡 | 色婷婷播放| 日韩电影黄色 | www.99在线观看 | 久久天天躁夜夜躁狠狠躁2022 | 97超碰中文字幕 | 国产高清中文字幕 | 婷婷射五月| 亚洲精品午夜国产va久久成人 | 天天干天天做 | 国产高清久久久久 | 亚洲精品网页 | 五月婷婷在线视频 | 久久视频在线观看中文字幕 | 成年人在线看片 | 久久精品一区二区三区视频 | 久久成人麻豆午夜电影 | 国产精品小视频网站 | 日韩高清无线码2023 | 成年人免费看片 | 国产精品成人品 | 亚洲国产日韩精品 | 亚洲一区二区三区91 | 粉嫩一二三区 | jizz欧美性9 国产一区高清在线观看 | 久久久久久久久久久久国产精品 | 国产午夜一区二区 | 蜜臀av在线一区二区三区 | 久久综合丁香 | 天天弄天天操 | 久草资源在线 | 国产99亚洲 | 久av电影| 免费黄色av | 亚洲婷久久 | 奇米影视四色8888 | 国产视频日韩视频欧美视频 | 四月婷婷在线观看 | 日韩网站在线播放 | 午夜性生活 | 免费看日韩片 | 国产精品久久久久一区 | 国内精品久久久久久久久久 | 婷婷伊人五月 | 日韩一级黄色av | 夜夜夜夜夜夜操 | 亚洲综合爱| 日韩网站在线观看 | 日日操天天操狠狠操 | av网站手机在线观看 | 久久久久电影网站 | 久草免费手机视频 | 日本久久中文 | 亚洲精品在线观看不卡 | 香蕉视频在线播放 | 日韩理论片在线 | 色偷偷88888欧美精品久久久 | 欧洲亚洲女同hd | 婷婷电影在线观看 | 国产大片黄色 | 久久国产精品视频免费看 | 日韩激情三级 | 69久久久 | 久久av不卡 | 国产精品久久久久久爽爽爽 | 综合亚洲视频 | 久久久久高清毛片一级 | 99久久精品视频免费 | 久久99精品久久久久久三级 | 欧美精品中文在线免费观看 | 一区二区视频网站 | 92av视频| 国产色综合天天综合网 | 欧美在线观看视频一区二区三区 | www激情com| 中文字幕 在线 一 二 | 国产视频精品免费 | 久久午夜精品影院一区 | 丁香六月中文字幕 | 五月天激情视频 | 黄色毛片网站在线观看 | 亚洲日本中文字幕在线观看 | 成人禁用看黄a在线 | 一区二区三区电影在线播 | а天堂中文最新一区二区三区 | 黄色一级在线视频 | 在线观看免费成人av | 看国产黄色大片 | 日本爱爱免费视频 | 日韩三级视频在线观看 | 亚洲精品乱码久久久久久写真 | 久久 国产一区 | 中文字幕影片免费在线观看 | 免费在线观看av电影 | 天天操天天射天天舔 | a视频在线观看 | 国产第一页福利影院 | 日日夜夜精品免费 | 亚洲一区黄色 | 亚洲最大在线视频 | 性色在线视频 | 国产一区二区三区网站 | 伊人国产在线观看 | 免费在线观看av网址 | 久久人人精品 | 亚洲久久视频 | 麻豆91网站| 亚洲激情在线播放 | 91精品资源 | 亚洲激情综合 | 亚洲五月 | 亚洲精品久久久久中文字幕二区 | 日韩在线观看视频免费 | 国产午夜精品久久 | 91精品区| 久久精品中文字幕免费mv | 狠狠做深爱婷婷综合一区 | 日韩在线视频二区 | 日本中文字幕电影在线免费观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产无套一区二区三区久久 | 99精品国产视频 | 偷拍区另类综合在线 | 国产免费又爽又刺激在线观看 | 国产精品手机在线播放 | 国产在线观看不卡 | 成人xxxx | 成人av高清在线 | 97视频免费观看 | 午夜国产一区 | 500部大龄熟乱视频使用方法 | 午夜在线观看一区 | 精品一区免费 | 久久的色| 在线看片一区 | 99精品视频免费观看 | 欧美亚洲国产日韩 | 久久人人添人人爽添人人88v | 在线免费观看黄色 | 91专区在线观看 | 91九色网站| 午夜电影中文字幕 | 久久av电影| 久久久久高清 | 三上悠亚一区二区在线观看 | 亚洲欧美怡红院 | 成人免费av电影 | 国产精品久久久久一区二区三区 | www色av| 国产91精品看黄网站在线观看动漫 | 欧美先锋影音 | 午夜少妇 | 免费观看日韩 | 亚洲午夜av | 亚洲视屏在线播放 | 免费av黄色 | 亚洲精品合集 | 国产亚洲aⅴaaaaaa毛片 | 天天操夜夜操天天射 | 日韩av电影国产 | 丁香六月久久综合狠狠色 | 久99久久| 少妇av网| 久久99国产精品视频 | 麻豆 91 在线 | 国产专区在线 | 国产91探花| 日韩色一区二区三区 | 国产黄网在线 | 国产精品入口a级 | 91在线视频精品 | 东方av免费在线观看 | 国产一级二级av | a在线观看免费视频 | 18网站在线观看 | 亚洲一级电影在线观看 | 天堂av网址 | 亚洲一级国产 | 欧美福利网址 | 国产91九色视频 | 久久久久久国产一区二区三区 | 91网址在线看 | 91香蕉视频黄 | 国内精品久久久久影院日本资源 | 1000部18岁以下禁看视频 | 久久黄色影视 | 久久草| 51精品国自产在线 | 国产精品久久久久久久久久妇女 | 天天操天天操天天操天天 | 亚洲人成影院在线 | 五月天av在线 | 国产手机在线 | 日韩网站一区二区 | 日韩高清在线观看 | 日韩色在线观看 | 婷婷狠狠操 | 久久精品一区二区三区国产主播 | 韩国av永久免费 | 91av视频播放 | 精品伦理一区二区三区 | 在线免费观看黄色小说 | 综合久久久久 | 色婷婷精品大在线视频 | 成人黄色国产 | 色噜噜日韩精品一区二区三区视频 | 国产亚洲精品久久 | 在线视频91| 丰满少妇一级片 | 久久视频免费在线观看 | 婷婷夜夜| 91精品久久久久 | 日韩欧美网站 | 日日日爽爽爽 | 激情av一区二区 | av片中文 | 少妇视频一区 | 国产资源在线免费观看 | 九九综合久久 | 中文字幕在线观看1 | 在线观看91 | 97视频在线 | 国内精品免费久久影院 | 日韩欧美一区二区不卡 | 一区二区三区在线不卡 | 中文在线 | 午夜av在线免费 | 国产精品系列在线播放 | 国产精品 日韩 | 中文字幕在线看片 | 久久久久成人精品亚洲国产 | 干干夜夜 | av中文字幕免费在线观看 | 亚洲爱视频| 久久私人影院 | 欧美精品久久久久久久 | 亚洲国产美女精品久久久久∴ | 欧美aaa一级 | 日韩大片免费在线观看 | 亚洲闷骚少妇在线观看网站 | 午夜国产福利视频 | 国产原创av片| 国产区免费在线 | 国产成人精品国内自产拍免费看 | 亚洲无吗天堂 | 中文字幕日韩精品有码视频 | 免费a视频在线观看 | 国产午夜精品一区二区三区欧美 | 日av免费| 麻豆视频免费网站 | 日韩精品亚洲专区在线观看 | 特级黄色一级 | 黄色特一级片 | 国产一区二区成人 | 国产精品视频全国免费观看 | 一区二区精品在线 | 日韩av免费在线电影 | 有码视频在线观看 | 免费看片色 | 国产又粗又猛又黄视频 | avwww在线观看 | 色婷婷久久久 | 久久久久国产精品一区 | 久操视频在线观看 | 国产精品一级在线 | 亚洲精品国产精品乱码不99热 | 国产第一页福利影院 | 国产视频日本 | 91人人干| 玖玖视频在线 | 国产视频精选 | 97色se| 成人性生活大片 | 丁香激情综合久久伊人久久 | 午夜视频一区二区三区 | 毛片基地黄久久久久久天堂 | 国产精品福利无圣光在线一区 | 色激情在线| 亚洲91网站 | 精品字幕 | 在线91av| 久久久在线 | 狠狠干网 | 久久久久久久久黄色 | 99精彩视频在线观看免费 | 黄色大片中国 | 三级黄色片子 | 91视频链接| 在线v片免费观看视频 | 免费观看成人 | 亚洲日本va午夜在线影院 | 久久久久久精 | www视频在线播放 | 天天爽人人爽夜夜爽 | 免费一级特黄毛大片 | 久久国产精品久久国产精品 | av在线等 | 国产精品久久久久久久久软件 | 在线综合 亚洲 欧美在线视频 | 天天天天综合 | 天天色天天干天天 | 中文字幕日韩国产 | 又爽又黄又刺激的视频 | 日本黄色大片免费看 | 久久成年人网站 | 中文在线a∨在线 | 去干成人网 | 久久免费成人精品视频 | 亚洲欧美精品一区 | 欧美日韩一区二区视频在线观看 | 91完整版观看 | 日韩电影在线观看一区二区 | 美女视频久久 | 日本黄区免费视频观看 | 欧美经典久久 | 黄色www免费 | 三上悠亚一区二区在线观看 | 这里只有精品视频在线观看 | 欧美黑吊大战白妞欧美 | 97超碰人人澡人人爱学生 | 久久夜av| 99成人在线视频 | 亚洲综合在线五月 | 超碰在线cao | 久久久影院官网 | 最近更新好看的中文字幕 | 四虎影视成人精品 | 狠狠狠狠狠狠 | 日韩欧美在线综合网 | 88av视频 | 黄色1级大片 | 午夜视频在线观看一区二区三区 | 成人亚洲精品国产www | 国产成人一区二区三区 | 成人a视频片观看免费 | 91精品小视频 | 久久精品视频免费 | 中文在线a√在线 | 亚洲一区视频免费观看 | 日韩在线视频网址 | 国产伦精品一区二区三区无广告 | 黄色官网在线观看 | 欧美激情第十页 | 久热av在线 | 97在线视 | 久艹视频免费观看 | 久久精品视频中文字幕 | 久久精品国产亚洲 | 在线播放 日韩专区 | 欧美乱熟臀69xxxxxx | 亚洲精品视频中文字幕 | 欧美精彩视频在线观看 | 欧美日韩高清 | 97av影院 | 国产精品18久久久久久久久久久久 | 久久精品影片 | 欧美va天堂va视频va在线 | 狠狠操天天射 | 在线视频日韩欧美 | 五月婷婷激情综合网 | 中文字幕一区二区三区四区久久 | 日本中文字幕久久 | 91精品啪啪 | 91人人人 | 粉嫩av一区二区三区四区五区 | 欧美日韩免费在线观看视频 | 日韩中文字幕免费在线播放 | 亚洲国内精品在线 | 97成人资源| 天天干天天草天天爽 | 在线a视频 | 在线观看亚洲国产 | 久久av在线| 亚洲成人精品久久久 | 免费在线91| 日韩成人免费电影 | 人人看97 | 日日夜夜噜 | 又长又大又黑又粗欧美 | 黄色日本免费 | 婷婷激情影院 | 色多多视频在线 | 午夜国产一区二区三区四区 | 色综合天天综合在线视频 | 国产福利一区二区三区在线观看 | 国产精品久久久久久久久久99 | 国内精品亚洲 | 在线视频日韩一区 | 最新高清无码专区 | 日韩中文久久 | 国产在线播放一区 | 国产高清av在线播放 | 青青草久草在线 | 日韩高清不卡一区二区三区 | 日韩免费网址 | 久久久国产精品免费 | 99色在线 | 国产亚洲日本 | 99r在线精品 | 黄色一级在线观看 | 国产一级电影在线 | 丁香六月婷婷开心婷婷网 | 亚洲劲爆av| 日本黄色a级大片 | 在线视频1卡二卡三卡 | 99视频免费观看 | 精品一区久久 | 亚洲h色精品 | av片在线看 | 五月天免费网站 | 五月花激情 | 久久午夜国产精品 | 97在线观看免费视频 | 97精品在线观看 | 日韩有码网站 | 啪啪凸凸| 国产精品男女 | 欧美一区日韩一区 | 国产又粗又长的视频 | 精品国产1区2区 | 98久9在线 | 免费 | 国产精品视频全国免费观看 | 国产精品久久久久三级 | 精品国产自 | 成人黄色资源 | 亚洲精品视频在线看 | av高清网站在线观看 | 色天天久久 | 成全免费观看视频 | 九九九电影免费看 | 久久久91精品国产 | 久久久99精品免费观看 | 91插插插免费视频 | 国产精品永久在线观看 | 最新日韩精品 | 久久五月婷婷丁香 | 欧美少妇xxx | 有码视频在线观看 | 国产69精品久久久久99尤 | 日韩在线大片 | 日韩在线免费小视频 | 日韩理论片在线观看 | 国产91全国探花系列在线播放 | 亚洲精品免费视频 | 99re在线视频观看 | 在线观看视频精品 | 国产99久久久国产精品免费二区 | 婷婷国产v亚洲v欧美久久 | avwww在线| 欧美一级性生活视频 | 国产精品永久久久久久久久久 | 国内揄拍国内精品 | 国产区精品在线 | 国产大尺度视频 | 国产成人高清在线 | 日韩电影在线看 | 国产精品久久久久毛片大屁完整版 | 香蕉视频网站在线观看 | 久久天天操 | 韩国av一区 | 亚洲日本成人 | 91网站在线视频 | 免费精品在线观看 | 国产成人精品久久 | 亚洲精品国产精品乱码不99热 | 91视频在线自拍 | 亚洲美女精品区人人人人 | 国产亚洲综合在线 | 国产精品久久网站 | 国产一区二区高清不卡 | 国产99久久九九精品免费 | 欧美性生活小视频 | 亚洲成人频道 | 欧美激情综合色 | 色偷偷男人的天堂av | 国内视频在线观看 | 色偷偷网站视频 | 美国人与动物xxxx | 国产精品成人一区二区三区 | 久久久久久久久久久高潮一区二区 | 在线国产91| 青青河边草免费观看 | 97视频人人免费看 | 黄色免费高清视频 | 在线视频 一区二区 | 婷婷综合在线 | 碰碰影院 | 日韩视频在线播放 | 中文字幕色婷婷在线视频 | 亚洲专区欧美专区 | 天天爽天天做 | 久久免费视频在线观看30 | 久久99久久99精品免视看婷婷 | 亚洲欧洲一级 | 色香com.| 天天插天天狠天天透 | 国产成人一区二区三区在线观看 | 在线免费高清一区二区三区 | 色综合久久综合网 | 国产成人高清 | 免费观看91视频大全 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 黄色成年| 国产精品亚| 顶级bbw搡bbbb搡bbbb | 色吊丝av中文字幕 | av在线免费不卡 | 色的网站在线观看 | 五月婷婷综合在线观看 | 免费h在线观看 | 99热在线看 | 中国一级特黄毛片大片久久 | 欧美激情视频在线免费观看 | 欧美a级片网站 | 中文字幕精品视频 | 亚洲电影一级黄 | 91九色在线视频 | 少妇bbb | 91九色国产视频 | 日韩在线观看第一页 | 亚洲高清国产视频 | 视频 天天草 | 美女网站在线观看 | 2022中文字幕在线观看 | 五月天激情视频在线观看 | 国产精国产精品 | 欧美色图亚洲图片 | 亚洲成人一区 | 国产护士hd高朝护士1 | 91毛片视频 | 精品在线视频一区二区三区 | 亚洲黄色在线 | 亚洲精品视频在线播放 | 久久久久在线观看 | 亚洲美女视频在线 | 国产精品久久久久高潮 | 免费福利小视频 | 国产精品久久久久影院日本 | 国产一级片免费播放 | 97在线免费视频观看 | 欧美怡红院 | 成 人 黄 色 免费播放 | 天天躁天天狠天天透 | 国产黄大片 | 国产高清综合 | 免费三级a| 欧美日韩国产区 | 在线观看视频在线 | 精品国精品自拍自在线 | 九九九九九精品 | 五月婷婷在线观看 | 日韩av免费一区二区 | 免费在线播放黄色 | 国产精品久久久久久久久久久久午夜 | 久久精品综合 | 又黄又爽又刺激的视频 | 青青久草在线 | 欧美日韩免费观看一区二区三区 | 超碰免费成人 | 欧美a在线看 | 国产一级二级在线播放 | 日韩一区二区在线免费观看 | 精品女同一区二区三区在线观看 | 在线视频免费观看 | 制服丝袜亚洲 | 国内视频在线 | 美女网站免费福利视频 | 中文字幕在线一区观看 | 在线导航福利 | 国产高清视频免费最新在线 | 亚洲无吗av | 人人涩 | 免费日韩视 | 一区二区不卡视频在线观看 | 精品国产一区二区三区久久久久久 | 国内精品久久久久影院一蜜桃 | 免费男女羞羞的视频网站中文字幕 | 黄色影院在线播放 | 韩国av一区 | 久久久久区 | 欧美一二三在线 | 国产伦理一区二区三区 | 亚洲免费av片 | 欧亚久久| 国产精品亚州 | 亚洲国产精品传媒在线观看 | 色资源中文字幕 | 日日日操| 国产在线成人 | 91桃色免费观看 | 精品v亚洲v欧美v高清v | 久久久久综合网 | 亚洲成人精品国产 | 西西444www| 日韩精品一区二区三区高清免费 | 精品麻豆入口免费 | 国产99一区二区 | 综合精品久久久 | 欧美日韩精品在线视频 | 国产一区二区三区免费观看视频 | 精品国产一区二区三区四 | 亚洲人成网站精品片在线观看 | 国产在线a视频 | 亚洲精品久久久久久久不卡四虎 | 五月婷婷综合在线观看 | 九九九国产 | 日韩激情中文字幕 | 国产精品99久久久久人中文网介绍 | 久久久国产精品一区二区中文 | 久久久久免费视频 | 狠狠躁夜夜av | 久草在线看片 | 偷拍福利视频一区二区三区 | av福利在线| 亚洲综合精品在线 | 成人一区二区三区在线观看 | 日本最新中文字幕 | 免费看搞黄视频网站 | 香蕉视频免费在线播放 | 日韩av成人在线 | 欧美吞精 | 亚洲国产日韩精品 | 色综合久久久久久中文网 | 一区二区三区免费在线观看视频 | 欧美日韩亚洲在线 | 国产精品久久久久久久久蜜臀 | 波多野结衣电影一区二区三区 | 亚洲视频1区2区 | 国产一区二区在线观看免费 | 久草精品视频在线观看 | 国产在线视频在线观看 | 亚洲不卡av一区二区三区 | 亚洲视屏在线播放 | 亚洲欧美一区二区三区孕妇写真 | 亚州av一区 | 久久69av | 97国产大学生情侣白嫩酒店 | aⅴ精品av导航 | 久久精品一区二区三区中文字幕 | 91自拍视频在线观看 | 天天躁日日 | www视频免费在线观看 | 91成人精品在线 | 国产精品成人国产乱一区 | 国产一区二区综合 | 毛片播放网站 | 超碰免费97| 中文字幕 国产 一区 | 在线国产片| 成人黄大片视频在线观看 | 国产精品二区在线观看 | 人成午夜视频 | 99色在线视频 | 日韩一区二区三 | 在线免费视 | 999国内精品永久免费视频 | 成人国产精品av | a视频在线播放 | 三级毛片视频 | 国产精品欧美久久久久无广告 | 国产麻豆精品免费视频 | av观看免费在线 | 日韩成片| 国产日韩欧美在线影视 | 亚洲女人av| 午夜在线看片 | 成人久久18免费网站麻豆 | 日韩黄色网络 | 久久久国产一区二区三区四区小说 | 又色又爽又激情的59视频 | 在线日韩视频 | 日韩免费不卡av | 国内精品久久久久久久久久久久 | 欧美视频在线观看免费网址 | 国产精品视频app | 日韩h在线观看 | 五月情婷婷 | 日本黄色一级电影 | 人人爽人人爽av | 精品一二三区 | 日本黄色片一区二区 | 久久国产热视频 | 欧美性生交大片免网 | 国产成人一区二区精品非洲 | 日韩免费观看高清 | 日韩最新理论电影 | 亚洲激情精品 | 久久久午夜精品理论片中文字幕 | 国产精品99久久久久久久久久久久 | 久av在线 | 狠狠色2019综合网 | 精品视频国产一区 | 久操视频在线免费看 | 精产嫩模国品一二三区 | 99久久久国产精品美女 | 黄色小说在线观看视频 | 久草资源在线 | 一区二区三区精品在线视频 | 亚洲欧美日韩中文在线 | a久久免费视频 | a在线观看免费视频 | 久久天天躁狠狠躁夜夜不卡公司 | 婷婷在线色 | 亚洲h视频在线 | 九九免费在线观看视频 | 美女视频网站久久 | 日韩午夜三级 | 最近字幕在线观看第一季 | 日韩理论片在线观看 | 在线免费观看黄色小说 | 九九99| 激情久久久 | 天天射天天操天天干 | 欧美激情操 | 国产91国语对白在线 | 天天爽天天爽天天爽 | 激情五月在线观看 | 国精产品999国精产品视频 | 狠狠色香婷婷久久亚洲精品 | 国产精品激情 | 亚洲成a人片77777kkkk1在线观看 | 成人在线观看免费视频 | 毛片网站在线观看 | 国产伦精品一区二区三区高清 | 天天色天天色 | 91大片网站 | 精品影院一区二区久久久 | 国产一区二区精品久久 | 久久精品欧美一区二区三区麻豆 | 一区二区中文字幕在线播放 | 九九热有精品 | 夜夜夜精品 | 色综合天天 | 在线国产黄色 | 日韩精品一区二区久久 | 又黄又刺激又爽的视频 | 三上悠亚在线免费 | 又爽又黄又无遮挡网站动态图 | 在线天堂中文在线资源网 | 日韩免费区 | 国产手机av | 国产成人61精品免费看片 | 日韩中文幕 | 日日夜夜天天干 | 日韩欧美精品一区二区三区经典 | 337p西西人体大胆瓣开下部 | 久久久久久久久久久久久久免费看 | 国产传媒一区在线 | 久草在线久草在线2 | 国产精品一区二区在线观看免费 | 综合影视 | www.天天色.com | 91精品久久久久久综合五月天 | 久久免费视频1 | 久久成电影 | 日韩资源在线 | 伊人资源视频在线 | 天天射天天操天天 | 免费av网站观看 | 午夜精品久久久久久久99 | 亚洲一区不卡视频 | 麻豆视频91| 综合激情 | 天天操欧美| 亚洲九九精品 | 美女国内精品自产拍在线播放 | 久久精品一区二区三区中文字幕 | 亚洲欧美日韩精品一区二区 | 欧美大香线蕉线伊人久久 | 色丁香婷婷 | 男女视频国产 | 九九有精品| 日韩免费电影一区二区三区 | 亚洲 欧洲 国产 精品 | 五月婷影院| 欧美一区二区三区四区夜夜大片 | 久久久国产一区二区三区 | 热久久精品在线 | 久久久久女人精品毛片九一 | 99久久久久 | 国产视频综合在线 | 99草视频| 国产美女精彩久久 | 在线视频 精品 | 亚洲免费在线播放视频 | 免费精品视频在线观看 | 天天曰天天爽 | 成人午夜网 | 91成人在线观看喷潮 | 欧美日韩在线免费观看 | 日韩最新中文字幕 | 精品久久久影院 | 在线观看国产中文字幕 | 日韩精品一区二区三区在线视频 | 手机看片1042 | 国产欧美精品一区二区三区四区 | 中文视频一区二区 | 九九久久久久久久久激情 | 欧美在线aa | 视频在线观看亚洲 | 中文字幕在线观看第三页 | 日韩午夜大片 | 天天射天天做 | 免费观看的av网站 | 五月天婷亚洲天综合网精品偷 | 国产精品大片免费观看 | 免费在线播放 | 国产成人av电影在线 | 免费看黄在线观看 | 中文字幕专区高清在线观看 | 一区二区三区四区五区在线 | 国产日韩欧美在线影视 | 国产精品高潮呻吟久久久久 | 丁香激情五月 | 草久久久 | 最近中文字幕大全中文字幕免费 | 免费高清在线观看成人 | 在线观看日本韩国电影 | 99色免费视频 | 日日爽天天 | 五月婷婷在线综合 | 超碰人人干人人 | 在线免费三级 | 中日韩在线视频 | 久草视频在线免费看 | 蜜臀av免费一区二区三区 | 日韩高清观看 | 国产婷婷视频在线 | 久久这里只精品 | 精品国模一区二区 | 精品福利视频在线观看 | 亚洲一级二级 | 在线免费观看黄色 | 国产91综合一区在线观看 | 不卡的av在线| 91在线看免费 | 国产精品theporn | 全黄网站 | 免费网站看av片 | www.亚洲精品视频 | 久久艹在线| 99亚洲精品在线 | 国产一区二区三区视频在线 | 91丨九色丨蝌蚪丰满 | 超碰97中文 | 欧美国产在线看 | 成人午夜片av在线看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 伊人夜夜 | 中文字幕在线观看不卡 | 三级黄色片子 | 亚洲最大av在线播放 | av福利在线 | 日批网站在线观看 | 天天要夜夜操 | 欧美成人h版在线观看 | 2019中文字幕网站 | 久久黄色免费观看 | 亚洲精品久久久蜜臀下载官网 | 18岁免费看片 | 特级西西444www高清大视频 | 国产一级h | 黄色免费网站大全 | 久久精品国亚洲 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 中文字幕之中文字幕 | 日韩精品视频免费 | av在线进入 | 成年人国产在线观看 | 国产一区二区手机在线观看 | 日韩免费av在线 | 欧美日韩国产精品一区二区亚洲 | 免费视频一二三区 | 日韩在线播放视频 | 97在线免费视频观看 | 在线免费91 | 国产色在线,com | 91精品在线观看入口 | 中文区中文字幕免费看 | 亚洲综合色站 | 日韩有色 | 96av视频| 精品字幕 | 精品国产一区二区三区av性色 | 五月激情片| 久久亚洲在线 | 五月婷婷视频 | 探花视频在线观看+在线播放 | 久草香蕉在线视频 | 久久亚洲人 | 天天操天天插 | 亚洲精品美女 | 国产又粗又猛又黄又爽 | 精品麻豆入口免费 | 国产一区二区久久久 | 亚州国产精品 | 国产精品va最新国产精品视频 | 青青河边草免费直播 | 久久久高清一区二区三区 | 久久伊人操 | 欧美日韩精品在线视频 | 日本三级在线观看中文字 | 国产韩国日本高清视频 | 国产 欧美 日韩 | 色wwwww| 国产大片免费久久 | 日韩影视在线 | 2019中文最近的2019中文在线 | 精品一区二区三区电影 | 亚洲精品乱码久久久久久蜜桃91 | 精品一区二区免费在线观看 | 在线观看91av| 日韩电影久久久 | 久视频在线 | 日本乱码在线 | 天天天天天天天操 | 国产97超碰| 亚洲欧洲成人精品av97 | 99riav1国产精品视频 | 亚洲免费精品一区二区 | 91大神精品视频在线观看 | 婷婷激情综合 | 色婷婷导航 | 免费观看一级视频 | 五月激情五月激情 | 亚洲精品男人天堂 | 精品自拍网 | 特片网久久 | 国产在线中文 | 91传媒在线看| 天天操天天射天天操 | 国产粉嫩在线观看 | 中文字幕av网站 | 麻豆91小视频 | 亚洲精品在线视频网站 | 国产精品精品国产色婷婷 | 成人四虎影院 | 亚洲精品国产精品国自产在线 | 国产高清视频免费在线观看 | 亚洲有 在线 | 在线中文字幕电影 | 欧美日韩视频一区二区三区 | 国产在线观看免 | 久久不色 | av中文字幕日韩 |