国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > Ruby > 正文

常見的Ruby數據庫連接技術

2020-02-24 15:38:37
字體:
來源:轉載
供稿:網友

當我們使用Ruby語言時,經常會遇到與數據庫相關的知識,在這里武林技術頻道小編將到大家學習常見的Ruby數據庫連接技術,希望對你學習這方面知識有幫助!

DBI 即 Database independent interface,代表了 Ruby 獨立于數據庫的接口。DBI 在 Ruby 代碼與底層數據庫之間提供了一個抽象層,允許您簡單地實現數據庫切換。它定義了一系列方法、變量和規范,提供了一個獨立于數據庫的一致的數據庫接口。

DBI 可與下列進行交互:

  • ??? ADO (ActiveX Data Objects)
  • ??? DB2
  • ??? Frontbase
  • ??? mSQL
  • ??? MySQL
  • ??? ODBC
  • ??? Oracle
  • ??? OCI8 (Oracle)
  • ??? PostgreSQL
  • ??? Proxy/Server
  • ??? SQLite
  • ??? SQLRelay

DBI 應用架構

DBI 獨立于任何在后臺中可用的數據庫。無論您使用的是 Oracle、MySQL、Informix,您都可以使用 DBI。下面的架構圖清晰地說明了這點。

201541090204770.jpg (381×168)

Ruby DBI 一般的架構使用兩個層:

  • ??? 數據庫接口(DBI)層。該層是獨立于數據庫,并提供了一系列公共訪問方法,方法的使用不分數據庫服務器類型。
  • ??? 數據庫驅動(DBD)層。該層是依賴于數據庫,不同的驅動提供了對不同的數據庫引擎的訪問。MySQL、PostgreSQL、InterBase、Oracle 等分別使用不同的驅動。每個驅動都負責解釋來自 DBI 層的請求,并把這些請求映射為適用于給定類型的數據庫服務器的請求。

先決條件

如果您想要編寫 Ruby 腳本來訪問 MySQL 數據庫,您需要先安裝 Ruby MySQL 模塊。

該模塊是一個 DBD,可從 http://www.tmtm.org/en/mysql/ruby.html" target="_blank">ruby/ 上下載。
獲取并安裝 Ruby/DBI

您可以從下面的鏈接下載并安裝 Ruby DBI 模塊:

http://rubyforge.org/projects/ruby-dbi/

在開始安裝之前,請確保您擁有 root 權限?,F在,請安裝下面的步驟進行安裝:
步驟 1

$ tar zxf dbi-0.2.0.tar.gz

步驟 2

進入目錄 dbi-0.2.0,在目錄中使用 setup.rb 腳本進行配置。最常用的配置命令是 config 參數后不跟任何參數。該命令默認配置為安裝所有的驅動。

$ ruby setup.rb config

更具體地,您可以使用 --with 選項來列出了您要使用的特定部分。例如,如果只想配置主要的 DBI 模塊和 MySQL DBD 層驅動,請輸入下面的命令:

$ ruby setup.rb config --with=dbi,dbd_mysql

步驟 3

最后一步是建立驅動器,使用下面命令進行安裝:

$ ruby setup.rb setup$ ruby setup.rb install
數據庫連接

假設我們使用的是 MySQL 數據庫,在連接數據庫之前,請確保:

  • ??? 您已經創建了一個數據庫 TESTDB。
  • ??? 您已經在 TESTDB 中創建了表 EMPLOYEE。
  • ??? 該表帶有字段 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。
  • ??? 設置用戶 ID "testuser" 和密碼 "test123" 來訪問 TESTDB
  • ??? 已經在您的機器上正確地安裝了 Ruby 模塊 DBI。
  • ??? 您已經看過 MySQL 教程,理解了 MySQL 基礎操作。

下面是連接 MySQL 數據庫 "TESTDB" 的實例:

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   # 獲取服務器版本字符串,并顯示   row = dbh.select_one("SELECT VERSION()")   puts "Server version: " + row[0]rescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"ensure   # 斷開與服務器的連接   dbh.disconnect if dbhend

當運行這段腳本時,將會在 Linux 機器上產生以下結果。
Server version: 5.0.45

如果建立連接時帶有數據源,則返回數據庫句柄(Database Handle),并保存到 dbh 中以便后續使用,否則 dbh 將被設置為 nil 值,e.err 和 e::errstr 分別返回錯誤代碼和錯誤字符串。

最后,在退出這段程序之前,請確保關閉數據庫連接,釋放資源。
INSERT 操作

當您想要在數據庫表中創建記錄時,需要用到 INSERT 操作。

一旦建立了數據庫連接,我們就可以準備使用 do 方法或 prepare 和 execute 方法創建表或創建插入數據表中的記錄。
使用 do 語句

不返回行的語句可通過調用 do 數據庫處理方法。該方法帶有一個語句字符串參數,并返回該語句所影響的行數。

dbh.do("DROP TABLE IF EXISTS EMPLOYEE")dbh.do("CREATE TABLE EMPLOYEE (   FIRST_NAME CHAR(20) NOT NULL,   LAST_NAME CHAR(20),   AGE INT,    SEX CHAR(1),   INCOME FLOAT )" );

同樣地,您可以執行 SQL INSERT 語句來創建記錄插入 EMPLOYEE 表中。

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME,          LAST_NAME,          AGE,      SEX,      INCOME)     VALUES ('Mac', 'Mohan', 20, 'M', 2000)" )   puts "Record has been created"   dbh.commitrescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開與服務器的連接   dbh.disconnect if dbhend
使用 prepare 和 execute

您可以使用 DBI 的 prepare 和 execute 方法來執行 Ruby 代碼中的 SQL 語句。

創建記錄的步驟如下:

??? 準備帶有 INSERT 語句的 SQL 語句。這將通過使用 prepare 方法來完成。
??? 執行 SQL 查詢,從數據庫中選擇所有的結果。這將通過使用 execute 方法來完成。
??? 釋放語句句柄。這將通過使用 finish API 來完成。
??? 如果一切進展順利,則 commit 該操作,否則您可以 rollback 完成交易。

下面是使用這兩種方法的語法:

sth = dbh.prepare(statement)sth.execute  ... zero or more SQL operations ...sth.finish

這兩種方法可用于傳 bind 值給 SQL 語句。有時候被輸入的值可能未事先給出,在這種情況下,則會用到綁定值。使用問號(?)替代實際值,實際值通過 execute() API 來傳遞。

下面的實例在 EMPLOYEE 表中創建了兩個記錄:

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME,          LAST_NAME,          AGE,      SEX,      INCOME)          VALUES (?, ?, ?, ?, ?)" )   sth.execute('John', 'Poul', 25, 'M', 2300)   sth.execute('Zara', 'Ali', 17, 'F', 1000)   sth.finish   dbh.commit   puts "Record has been created"rescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開與服務器的連接   dbh.disconnect if dbhend

如果同時使用多個 INSERT,那么先準備一個語句,然后在一個循環中多次執行它要比通過循環每次調用 do 有效率得多。
READ 操作

對任何數據庫的 READ 操作是指從數據庫中獲取有用的信息。

一旦建立了數據庫連接,我們就可以準備查詢數據庫。我們可以使用 do 方法或 prepare 和 execute 方法從數據庫表中獲取值。

獲取記錄的步驟如下:

  • ??? 基于所需的條件準備 SQL 查詢。這將通過使用 prepare 方法來完成。
  • ??? 執行 SQL 查詢,從數據庫中選擇所有的結果。這將通過使用 execute 方法來完成。
  • ??? 逐一獲取結果,并輸出這些結果。這將通過使用 fetch 方法來完成。
  • ??? 釋放語句句柄。這將通過使用 finish 方法來完成。

下面的實例從 EMPLOYEE 表中查詢所有工資(salary)超過 1000 的記錄。

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   sth = dbh.prepare("SELECT * FROM EMPLOYEE            WHERE INCOME > ?")   sth.execute(1000)    sth.fetch do |row|    printf "First Name: %s, Last Name : %s/n", row[0], row[1]    printf "Age: %d, Sex : %s/n", row[2], row[3]    printf "Salary :%d /n/n", row[4]   end   sth.finishrescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"ensure   # 斷開與服務器的連接   dbh.disconnect if dbhend

這將產生以下結果:

First Name: Mac, Last Name : MohanAge: 20, Sex : MSalary :2000 First Name: John, Last Name : PoulAge: 25, Sex : MSalary :2300

還有很多從數據庫獲取記錄的方法,如果您感興趣,可以查看 Ruby DBI Read 操作。
Update 操作

對任何數據庫的 UPDATE 操作是指更新數據庫中一個或多個已有的記錄。下面的實例更新 SEX 為 'M' 的所有記錄。在這里,我們將把所有男性的 AGE 增加一歲。這將分為三步:

  • ??? 基于所需的條件準備 SQL 查詢。這將通過使用 prepare 方法來完成。
  • ??? 執行 SQL 查詢,從數據庫中選擇所有的結果。這將通過使用 execute 方法來完成。
  • ??? 釋放語句句柄。這將通過使用 finish 方法來完成。

如果一切進展順利,則 commit 該操作,否則您可以 rollback 完成交易。

#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1            WHERE SEX = ?")   sth.execute('M')   sth.finish   dbh.commitrescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開與服務器的連接   dbh.disconnect if dbhend

DELETE 操作

當您想要從數據庫中刪除記錄時,需要用到 DELETE 操作。下面的實例從 EMPLOYEE 中刪除 AGE 超過 20 的所有記錄。該操作的步驟如下:

  • ??? 基于所需的條件準備 SQL 查詢。這將通過使用 prepare 方法來完成。
  • ??? 執行 SQL 查詢,從數據庫中刪除所需的記錄。這將通過使用 execute 方法來完成。
  • ??? 釋放語句句柄。這將通過使用 finish 方法來完成。
  • ??? 如果一切進展順利,則 commit 該操作,否則您可以 rollback 完成交易。
#!/usr/bin/ruby -w require "dbi" begin   # 連接到 MySQL 服務器   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")   sth = dbh.prepare("DELETE FROM EMPLOYEE            WHERE AGE > ?")   sth.execute(20)   sth.finish   dbh.commitrescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開與服務器的連接   dbh.disconnect if dbhend

執行事務

事務是一種確保交易一致性的機制。事務應具有下列四種屬性:

  • ??? 原子性(Atomicity):事務的原子性指的是,事務中包含的程序作為數據庫的邏輯工作單位,它所做的對數據修改操作要么全部執行,要么完全不執行。
  • ??? 一致性(Consistency):事務的一致性指的是在一個事務執行之前和執行之后數據庫都必須處于一致性狀態。假如數據庫的狀態滿足所有的完整性約束,就說該數據庫是一致的。
  • ??? 隔離性(Isolation):事務的隔離性指并發的事務是相互隔離的,即一個事務內部的操作及正在操作的數據必須封鎖起來,不被其它企圖進行修改的事務看到。
  • ??? 持久性(Durability):事務的持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,它對數據庫中數據的改變應該是永久性的,耐得住任何數據庫系統故障。持久性通過數據庫備份和恢復來保證。

DBI 提供了兩種執行事務的方法。一種是 commit 或 rollback 方法,用于提交或回滾事務。還有一種是 transaction 方法,可用于實現事務。接下來我們來介紹這兩種簡單的實現事務的方法:
方法 I

第一種方法使用 DBI 的 commit 和 rollback 方法來顯式地提交或取消事務:

dbh['AutoCommit'] = false # 設置自動提交為 false.begin dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1     WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1     WHERE FIRST_NAME = 'Zara'") dbh.commitrescue puts "transaction failed" dbh.rollbackenddbh['AutoCommit'] = true

方法 II

第二種方法使用 transaction 方法。這個方法相對簡單些,因為它需要一個包含構成事務語句的代碼塊。transaction 方法執行塊,然后根據塊是否執行成功,自動調用 commit 或 rollback:

dbh['AutoCommit'] = false # 設置自動提交為 falsedbh.transaction do |dbh| dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1     WHERE FIRST_NAME = 'John'") dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1     WHERE FIRST_NAME = 'Zara'")enddbh['AutoCommit'] = true

COMMIT 操作

Commit 是一種標識數據庫已完成更改的操作,在這個操作后,所有的更改都不可恢復。

下面是一個調用 commit 方法的簡單實例。

dbh.commit

ROLLBACK 操作

如果您不滿意某個或某幾個更改,您想要完全恢復這些更改,則使用 rollback 方法。

下面是一個調用 rollback 方法的簡單實例。

dbh.rollback

斷開數據庫

如需斷開數據庫連接,請使用 disconnect API。

dbh.disconnect

如果用戶通過 disconnect 方法關閉了數據庫連接,DBI 會回滾所有未完成的事務。但是,不需要依賴于任何 DBI 的實現細節,您的應用程序就能很好地顯式調用 commit 或 rollback。
處理錯誤

有許多不同的錯誤來源。比如在執行 SQL 語句時的語法錯誤,或者是連接失敗,又或者是對一個已經取消的或完成的語句句柄調用 fetch 方法。

如果某個 DBI 方法失敗,DBI 會拋出異常。DBI 方法會拋出任何類型的異常,但是最重要的兩種異常類是 DBI::InterfaceError 和 DBI::DatabaseError。

這些類的 Exception 對象有 err、errstr 和 state 三種屬性,分表代表了錯誤號、一個描述性的錯誤字符串和一個標準的錯誤代碼。屬性具體說明如下:

  • ??? err:返回所發生的錯誤的整數表示法,如果 DBD 不支持則返回 nil。例如,Oracle DBD 返回 ORA-XXXX 錯誤消息的數字部分。
  • ??? errstr:返回所發生的錯誤的字符串表示法。
  • ??? state:返回所發生的錯誤的 SQLSTATE 代碼。SQLSTATE 是五字符長度的字符串。大多數的 DBD 并不支持它,所以會返回 nil。

在上面的實例中您已經看過下面的代碼:

rescue DBI::DatabaseError => e   puts "An error occurred"   puts "Error code:  #{e.err}"   puts "Error message: #{e.errstr}"   dbh.rollbackensure   # 斷開與服務器的連接   dbh.disconnect if dbhend

為了獲取腳本執行時有關腳本執行內容的調試信息,您可以啟用跟蹤。為此,您必須首先下載 dbi/trace 模塊,然后調用控制跟蹤模式和輸出目的地的 trace 方法:

?

復制代碼 代碼如下:

require "dbi/trace"
..............
?
trace(mode, destination)

?

mode 的值可以是 0(off)、1、2 或 3,destination 的值應該是一個 IO 對象。默認值分別是 2 和 STDERR。
方法的代碼塊

有一些創建句柄的方法。這些方法通過代碼塊調用。使用帶有方法的代碼塊的優點是,它們為代碼塊提供了句柄作為參數,當塊終止時會自動清除句柄。下面是一些實例,有助于理解這個概念。

  • ??? DBI.connect :該方法生成一個數據庫句柄,建議在塊的末尾調用 disconnect 來斷開數據庫。
  • ??? dbh.prepare :該方法生成一個語句句柄,建議在塊的末尾調用 finish。在塊內,您必須調用 execute 方法來執行語句。
  • ??? dbh.execute :該方法與 dbh.prepare 類似,但是 dbh.execute 不需要在塊內調用 execute 方法。語句句柄會自動執行。

實例 1

DBI.connect 可帶有一個代碼塊,向它傳遞數據庫句柄,且會在塊的末尾自動斷開句柄。
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",
?????????????????? "testuser", "test123") do |dbh|
實例 2

dbh.prepare 可帶有一個代碼塊,向它傳遞語句句柄,且會在塊的末尾自動調用 finish。

dbh.prepare("SHOW DATABASES") do |sth|    sth.execute    puts "Databases: " + sth.fetch_all.join(", ")end

實例 3

dbh.execute 可帶有一個代碼塊,向它傳遞語句句柄,且會在塊的末尾自動調用 finish。

dbh.execute("SHOW DATABASES") do |sth|  puts "Databases: " + sth.fetch_all.join(", ")end

DBI transaction 方法也可帶有一個代碼塊,這在上面的章節中已經講解過了。
特定驅動程序的函數和屬性

DBI 讓數據庫驅動程序提供了額外的特定數據庫的函數,這些函數可被用戶通過任何 Handle 對象的 func 方法進行調用。

使用 []= or [] 方法可以設置或獲取特定驅動程序的屬性。

DBD::Mysql 實現了下列特定驅動程序的函數:

201541090333160.jpg (945×780)

實例

#!/usr/bin/ruby require "dbi"begin  # 連接到 MySQL 服務器  dbh = DBI.connect("DBI:Mysql:TESTDB:localhost",            "testuser", "test123")  puts dbh.func(:client_info)  puts dbh.func(:client_version)  puts dbh.func(:host_info)  puts dbh.func(:proto_info)  puts dbh.func(:server_info)  puts dbh.func(:thread_id)  puts dbh.func(:stat)rescue DBI::DatabaseError => e  puts "An error occurred"  puts "Error code:  #{e.err}"  puts "Error message: #{e.errstr}"ensure  dbh.disconnect if dbhend

這將產生以下結果:

5.0.4550045Localhost via UNIX socket105.0.45150621Uptime: 384981 Threads: 1 Questions: 1101078 Slow queries: 4 /Opens: 324 Flush tables: 1 Open tables: 64 /Queries per second avg: 2.860

以上就是武林技術頻道給大家介紹的常見的Ruby數據庫連接技術,如若您想要學習更多關于技術方面的知識可以進入武林技術頻道網學習,最后預祝大家學習愉快。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
牛牛在线精品视频| 四虎精品成人a在线观看| 国产激情视频在线观看| 九九视频在线播放| 久久国产情侣| 国产一级免费看| 国产精品666| 精品福利影院| 欧洲亚洲精品视频| 国产美女av| 在线观看免费高清完整| 日本国产在线| 最好2018中文免费视频| 国产精品久久久久久精| 亚洲精品一区中文字幕电影| xxx国产精品| 丁香花高清视频完整版在线观看| 91福利在线免费| 亚洲一区免费在线| 国产裸舞福利在线视频合集| 国产福利免费在线观看| 麻豆视频国产| 国产精品伦一区二区三区视频| 在线观看视频污| 国产乱妇乱子在线播视频播放网站| 国产网红女主播精品视频| 一本大道五月香蕉| 国产视频二区| 超碰国产在线| a中文在线播放| 精品久久久久一区二区三区| 欧洲亚洲精品视频| ·天天天天操| 国产色在线播放| 国产中文在线观看| 亚洲精品影院在线| 中文岛国精品亚洲一区| 中文字幕在线视频观看| 福利视频网址导航| 超碰免费在线播放| www.狠狠操| 在线视频观看亚洲| 国产www.大片在线| 国产黄色免费网| 国产精品视频h| 国产一区二区三区不卡免费观看| av在线免费播放| 97视频在线| 国产精品bbw一区二区三区| 国产一二区在线| 国产羞羞视频在线观看| 国产一级二级三级在线观看| 国产三区四区在线观看| 国产欧美日韩第一页| 国产一级二级三级在线观看| 国产麻豆视频| 国产三级视频在线看| 中文字幕在线第一页| 九九热视频免费观看| 久草电影在线| √天堂资源地址在线官网| 国产主播色在线| 中文字幕在线永久在线视频| 国产免费福利网站| 国产www网站| 人人干人人插| 黄网在线免费| 69久久精品| 人人干人人插| 国产精品美女一区二区视频| 亚洲va国产日韩欧美精品色婷婷| 女同一区二区免费aⅴ| 日本中文字幕在线看| 国产不卡在线| 成年人在线观看| 在线色视频观看| 蜜桃视频中文字幕| 国产精品欧美色图| 男女羞羞视频在线观看| 国产黄色免费在线观看| 免费视频中文字幕| 国产在线www| 日本三级在线视频| 国产精品视频h| 国产美女被草| 欧美日韩在线中文字幕| 国产国产人免费人成免费视频| 亚洲天堂二区| 国产日韩欧美精品一区二区三区| 人人干人人插| 天天操天天射天天色| 97视频免费| 自拍av在线| 国产免费一级| 九九99九九精彩| 91网页在线观看| 免费a在线看| 一本大道香蕉久久| 92国产在线视频| 国产99在线|亚洲| 精品亚洲成a人片在线观看| 丁香综合在线| 国产视频资源| 国产探花在线观看| 精品国内自产拍在线视频| 国产极品一区二区三区 | 国产精品欧美韩国日本久久| 狠狠干婷婷色| 超碰在线国产| 国产在线观看网站| 午夜av在线播放| 国产精品视频h| 1区不卡电影| 精品国产免费观看一区| 天天干天天摸| 国产免费黄网站| 天堂在线一二区| 91网页在线观看| 亚洲综合在线网| 人人九九精品| 青草视频在线播放| 中文字幕av中文字幕| 精品欧美不卡一区二区在线观看| 亚洲图区欧美| 中文字幕第一页在线| 在线免费观看高清视频色| 在线看黄色av| 国产三区在线观看| 日本免费黄色| 91亚洲欧美| 高潮毛片在线观看| 99热99re6国产在线播放| 日本黄在线观看| 国产成人久久精品77777| 欧美日韩视频精品一区二区| 国产在线视频自拍| 精品国产二区三区| 99热在线免费观看| а√最新版地址在线天堂| 中文字幕一区二区三区免费视频| 夜色资源网av在先锋网站观看| 丁香综合五月| 日本福利在线观看| 99高清免费国产自产拍| 中文字幕在线播放网址| 免费中文字幕| jlzzjlzz欧美大全| 怡红院av在线| 国产福利片在线| 国产精品国产三级国产试看| 四虎一区二区三区| 91国内精品久久久久| 国产高清视频免费最新在线| 99视频在线观看地址| 国产在线二区| 九九视频在线播放| 国产中文字幕网| 成人欧美亚洲| 中文字幕网在线| 午夜视频在线免费| 国产一级黄色片免费| 国产麻豆高清视频在线第一页| 日本成人网址| 九色在线网站| 久热精品视频在线播放| 四虎精品成人a在线观看| 精品欧美色视频网站在线观看| 国产网站av| 国产视频在线播放| 欧美精品小视频| 狠狠狠综合7777久夜色撩人| www.操操操.com| 亚洲国产成人综合| 欧美视频免费一区二区三区| www.综合网.com| 国产中文在线视频| 国产精品xxx电影| 亚洲国产精品区| 国产免费一级片| av高清资源| 亚洲日本久久久午夜精品| av中文字幕在线看| 午夜不卡视频| 夜夜操天天干| 天天爱天天色| 亚洲综合天堂网| 国产农村一级特黄α**毛片| 国产黄色大片在线观看| 男女午夜视频在线观看| 国产黄色大片在线观看| 超碰人人在线| 精品伦理一区二区| 久久综合第一页| 国产精品视频一区麻豆| 麻豆精品不卡国产免费看| 国产小视频免费在线观看| av在线天天| 777电影在线观看| 国产麻豆麻豆| 激情丁香婷婷|