午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > Python3+SQLAlchemy+Sqlite3實現ORM教程

Python3+SQLAlchemy+Sqlite3實現ORM教程

熱門標簽:千呼ai電話機器人免費 申請辦個400電話號碼 柳州正規電銷機器人收費 外呼系統前面有錄音播放嗎 騰訊地圖標注有什么版本 深圳網絡外呼系統代理商 高德地圖標注字母 鎮江人工外呼系統供應商 400電話辦理費用收費

一、Sqlite3、SQLAlchemy安裝

Sqlite3是Python3標準庫不需要另外安裝,只需要安裝SQLAlchemy即可。本文sqlalchemy版本為1.2.12

pip install sqlalchemy

二、ORM操作

除了第一步創建引擎時連接URL不一樣,其他操作其他mysql等數據庫和sqlite都是差不多的。

2.1 創建數據庫連接格式說明

sqlite創建數據庫連接就是創建數據庫,而其他mysql等應該是需要數據庫已存在才能創建數據庫連接;建立數據庫連接本文中有時會稱為建立數據庫引擎。

2.1.1 sqlite創建數據庫連接

以相對路徑形式,在當前目錄下創建數據庫格式如下:

# sqlite://nohostname>/path>
# where path> is relative:
engine = create_engine('sqlite:///foo.db')

以絕對路徑形式創建數據庫,格式如下:

#Unix/Mac - 4 initial slashes in total
engine = create_engine('sqlite:////absolute/path/to/foo.db')
#Windows
engine = create_engine('sqlite:///C:\\path\\to\\foo.db')
#Windows alternative using raw string
engine = create_engine(r'sqlite:///C:\path\to\foo.db')

sqlite可以創建內存數據庫(其他數據庫不可以),格式如下:

# format 1
engine = create_engine('sqlite://')
# format 2
engine = create_engine('sqlite:///:memory:', echo=True)

2.1.2 其他數據庫創建數據庫連接

PostgreSQL:

# default
engine = create_engine('postgresql://scott:tiger@localhost/mydatabase')
# psycopg2
engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
# pg8000
engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')

MySQL:

# default
engine = create_engine('mysql://scott:tiger@localhost/foo')
# mysql-python
engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')
# MySQL-connector-python
engine = create_engine('mysql+mysqlconnector://scott:tiger@localhost/foo')
# OurSQL
engine = create_engine('mysql+oursql://scott:tiger@localhost/foo')

Oracle:

engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname')
engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname')

MSSQL:

# pyodbc
engine = create_engine('mssql+pyodbc://scott:tiger@mydsn')
# pymssql
engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')

2.2 創建數據庫連接

我們以在當前目錄下創建foo.db為例,后續各步同使用此數據庫。

在create_engine中我們多加了兩樣東西,一個是echo=Ture,一個是check_same_thread=False。

echo=Ture----echo默認為False,表示不打印執行的SQL語句等較詳細的執行信息,改為Ture表示讓其打印。

check_same_thread=False----sqlite默認建立的對象只能讓建立該對象的線程使用,而sqlalchemy是多線程的所以我們需要指定check_same_thread=False來讓建立的對象任意線程都可使用。否則不時就會報錯:sqlalchemy.exc.ProgrammingError: (sqlite3.ProgrammingError) SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 35608 and this is thread id 34024. [SQL: 'SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password \nFROM users \nWHERE users.name = ?\n LIMIT ? OFFSET ?'] [parameters: [{}]] (Background on this error at: http://sqlalche.me/e/f405)

from sqlalchemy import create_engine

engine = create_engine('sqlite:///foo.db?check_same_thread=False', echo=True)

2.3 定義映射

先建立基本映射類,后邊真正的映射類都要繼承它

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

然后創建真正的映射類,我們這里以一下User映射類為例,我們設置它映射到users表。

首先要明確,ORM中一般情況下表是不需要先存在的反而為了類與表對應無誤借助通過映射類來創建;當然表已戲存在了也無可以,在下一小結中你可以自己決定如果表存在時要如何操作是重新創建還是使用已有表,但使用已有表你需要確保和類的變量名與表的各字段名要對得上。

from sqlalchemy import Column, Integer, String

# 定義映射類User,其繼承上一步創建的Base
class User(Base):
  # 指定本類映射到users表
  __tablename__ = 'users'
  # 如果有多個類指向同一張表,那么在后邊的類需要把extend_existing設為True,表示在已有列基礎上進行擴展
  # 或者換句話說,sqlalchemy允許類是表的字集
  # __table_args__ = {'extend_existing': True}
  # 如果表在同一個數據庫服務(datebase)的不同數據庫中(schema),可使用schema參數進一步指定數據庫
  # __table_args__ = {'schema': 'test_database'}
  
  # 各變量名一定要與表的各字段名一樣,因為相同的名字是他們之間的唯一關聯關系
  # 從語法上說,各變量類型和表的類型可以不完全一致,如表字段是String(64),但我就定義成String(32)
  # 但為了避免造成不必要的錯誤,變量的類型和其對應的表的字段的類型還是要相一致
  # sqlalchemy強制要求必須要有主鍵字段不然會報錯,如果要映射一張已存在且沒有主鍵的表,那么可行的做法是將所有字段都設為primary_key=True
  # 不要看隨便將一個非主鍵字段設為primary_key,然后似乎就沒報錯就能使用了,sqlalchemy在接收到查詢結果后還會自己根據主鍵進行一次去重
  # 指定id映射到id字段; id字段為整型,為主鍵,自動增長(其實整型主鍵默認就自動增長)
  id = Column(Integer, primary_key=True, autoincrement=True)
  # 指定name映射到name字段; name字段為字符串類形,
  name = Column(String(20))
  fullname = Column(String(32))
  password = Column(String(32))

  # __repr__方法用于輸出該類的對象被print()時輸出的字符串,如果不想寫可以不寫
  def __repr__(self):
    return "User(name='%s', fullname='%s', password='%s')>" % (
          self.name, self.fullname, self.password)

在上面的定義我__tablename__屬性是寫死的,但有時我們可能想通過外部給類傳遞表名,此時可以通過以下變通的方法來實現:

def get_dynamic_table_name_class(table_name):
  # 定義一個內部類
  class TestModel(Base):
    # 給表名賦值
    __tablename__ = table_name
    __table_args__ = {'extend_existing': True}

    username = Column(String(32), primary_key=True)
    password = Column(String(32))
  # 把動態設置表名的類返回去
  return TestModel

2.4 創建數據表

# 查看映射對應的表
User.__table__

# 創建數據表。一方面通過engine來連接數據庫,另一方面根據哪些類繼承了Base來決定創建哪些表
# checkfirst=True,表示創建表前先檢查該表是否存在,如同名表已存在則不再創建。其實默認就是True
Base.metadata.create_all(engine, checkfirst=True)

# 上邊的寫法會在engine對應的數據庫中創建所有繼承Base的類對應的表,但很多時候很多只是用來則試的或是其他庫的
# 此時可以通過tables參數指定方式,指示僅創建哪些表
# Base.metadata.create_all(engine,tables=[Base.metadata.tables['users']],checkfirst=True)
# 在項目中由于model經常在別的文件定義,沒主動加載時上邊的寫法可能寫導致報錯,可使用下邊這種更明確的寫法
# User.__table__.create(engine, checkfirst=True)

# 另外我們說這一步的作用是創建表,當我們已經確定表已經在數據庫中存在時,我完可以跳過這一步
# 針對已存放有關鍵數據的表,或大家共用的表,直接不寫這創建代碼更讓人心里踏實

從上邊的討論可以知道,我們可以定義model然后根據model來創建數據表(當然也可以不創建),那可不可以反過來根據已有的表來自動生成model代碼呢,答案是可以的,使用sqlacodegen。

sqlacodegen安裝操作如下:

# 如果網絡通,直接pip安裝
pip install sqlacodegen

# 如果網絡不通,先在網絡通的機器上使用pip下載sqlacodegen及期依賴包
pip download sqlacodegen
# 上傳到真正要安裝的機器后再用pip安裝,依賴包也會自動安裝。版本可能會變化改成自己具體的包名
pip install sqlacodegen-2.1.0-py2.py3-none-any.whl

sqlacodegen生成model操作如下:

# linux應該被安裝在/usr/local/bin/sqlacodegen
# mysql+pymysql示例
# 可使用--tables指定要生成model的表,不指定時為所有表都生成model
# 可使用--outfile指定代碼輸出到的文件,不指定時輸出到stdout
# 注意只有當表有主鍵時sqlacodegen才生成如下的class,不然會使用舊的生成Table()類實例的形式
# 更多說明可使用-h參看
sqlacodegen mysql+pymysql://user:password@localhost/dbname [--tables table_name1,table_name2] [--outfile model.py]

如我的一個示例操作如下,成功為指定表生成model:

2.5 建立會話

增查改刪(CRUD)操作需要使用session進行操作

from sqlalchemy.orm import sessionmaker

# engine是2.2中創建的連接
Session = sessionmaker(bind=engine)

# 創建Session類實例
session = Session()

2.6 增(向users表中插入記錄)

# 創建User類實例
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')

# 將該實例插入到users表
session.add(ed_user)

# 一次插入多條記錄形式
session.add_all(
  [User(name='wendy', fullname='Wendy Williams', password='foobar'),
  User(name='mary', fullname='Mary Contrary', password='xxg527'),
  User(name='fred', fullname='Fred Flinstone', password='blah')]
)

# 當前更改只是在session中,需要使用commit確認更改才會寫入數據庫
session.commit()

2.7 查(查詢users表中的記錄)

2.7.1 查實現

query將轉成select xxx from xxx部分,filter/filter_by將轉成where部分,limit/order by/group by分別對應limit()/order_by()/group_by()方法。這句話非常的重要,理解后你將大量減少sql這么寫那在sqlalchemy該怎么寫的疑惑。

filter_by相當于where部分,外另可用filter。他們的區別是filter_by參數寫法類似sql形式,filter參數為python形式。

更多匹配寫法見:https://docs.sqlalchemy.org/en/13/orm/tutorial.html#common-filter-operators

our_user = session.query(User).filter_by(name='ed').first()

our_user

# 比較ed_user與查詢到的our_user是否為同一條記錄
ed_user is our_user

# 只獲取指定字段
# 但要注意如果只獲取部分字段,那么返回的就是元組而不是對象了
# session.query(User.name).filter_by(name='ed').all()
# like查詢
# session.query(User).filter(User.name.like("ed%")).all()
# 正則查詢
# session.query(User).filter(User.name.op("regexp")("^ed")).all()
# 統計數量
# session.query(User).filter(User.name.like("ed%")).count()
# 調用數據庫內置函數
# 以count()為例,都是直接func.func_name()這種格式,func_name與數據庫內的寫法保持一致
# from sqlalchemy import func
# session.query(func.count(User3.name)).one()
# 字段名為字符串形式
# column_name = "name"
# session.query(User).filter(User3.__table__.columns[column_name].like("ed%")).all()
# 獲取執行的sql語句
# 獲取記錄數的方法有all()/one()/first()等幾個方法,如果沒加這些方法,得到的只是一個將要執行的sql對象,并沒真正提交執行
# from sqlalchemy.dialects import mysql
# sql_obj = session.query(User).filter_by(name='ed')
# sql_command = sql_obj.statement.compile(dialect=mysql.dialect(), compile_kwargs={"literal_binds": True})
# sql_result = sql_obj.all()

另外要注意該鏈接Common Filter Operators節中形如equals的query.filter(User.name == 'ed'),在真正使用時都得改成session.query(User).filter(User.name == 'ed')形式,不然只后看到報錯“NameError: name 'query' is not defined”。

2.7.2 參數傳遞問題

我們上邊的sql直接是our_user = session.query(User).filter_by(name='ed').first()形式,但到實際中時User部分和name=‘ed'這部分是通過參數傳過來的,使用參數傳遞時就要注意以下兩個問題。

首先,是參數不要使用引號括起來。比如如下形式是錯誤的(使用引號),將報錯sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column

table_and_column_name = "User"
filter = "name='ed'"

our_user = session.query(table_and_column_name).filter_by(filter).first()

其次,對于有等號參數需要變換形式。如下去掉了引號,對table_and_column_name沒問題,但filter = (name='ed')這種寫法在python是不允許的

table_and_column_name = User
# 下面這條語句不符合語法
filter = (name='ed')

our_user = session.query(table_and_column_name).filter_by(filter).first()

對參數中帶等號的這種形式,現在能想到的只有使用filter代替filter_by,即將sql語句中的=號轉變為python語句中的==。正確寫法如下:

table_and_column_name = User
filter = (User.name=='ed')

our_user = session.query(table_and_column_name).filter(filter).first()

2.8 改(修改users表中的記錄)

# 要修改需要先將記錄查出來
mod_user = session.query(User).filter_by(name='ed').first()

# 將ed用戶的密碼修改為modify_paswd
mod_user.password = 'modify_passwd'

# 確認修改
session.commit()

# 但是上邊的操作,先查詢再修改相當于執行了兩條語句,和我們印象中的update不一致
# 可直接使用下邊的寫法,傳給服務端的就是update語句
# session.query(User).filter_by(name='ed').update({User.password: 'modify_passwd'})
# session.commit()
# 以同schema的一張表更新另一張表的寫法
# 在跨表的update/delete等函數中synchronize_session=False一定要有不然報錯
# session.query(User).filter_by(User.name=User1.name).update({User.password: User2.password}, synchronize_session=False)
# 以一schema的表更新另一schema的表的寫法
# 寫法與同一schema的一樣,只是定義model時需要使用__table_args__ = {'schema': 'test_database'}等形式指定表對應的schema

2.9 刪(刪除users表中的記錄)

# 要刪除需要先將記錄查出來
del_user = session.query(User).filter_by(name='ed').first()

# 打印一下,確認未刪除前記錄存在
del_user

# 將ed用戶記錄刪除
session.delete(del_user)

# 確認刪除
session.commit()

# 遍歷查看,已無ed用戶記錄
for user in session.query(User):
  print(user)

# 但上邊的寫法,先查詢再刪除,相當于給mysql服務端發了兩條語句,和我們印象中的delete語句不一致
# 可直接使用下邊的寫法,傳給服務端的就是delete語句
# session.query(User).filter_by(name='ed').first().delete()

2.10 直接執行SQL語句

雖然使用框架規定形式可以在一定程度上解決各數據庫的SQL差異,比如獲取前兩條記錄各數據庫形式如下。

# mssql/access
select top 2 * from table_name;

# mysql
select * from table_name limit 2;

# oracle
select * from table_name where rownum = 2;

但框架存消除各數據庫SQL差異的同時會引入各框架CRUD的差異,而開發人員往往就有一定的SQL基礎,如果一個框架強制用戶只能使用其規定的CRUD形式那反而增加用戶的學習成本,這個框架注定不能成為成功的框架。直接地執行SQL而不是使用框架設定的CRUD雖然不是一種被鼓勵的操作但也不應被視為一種見不得人的行為。

# 正常的SQL語句
sql = "select * from users"

# sqlalchemy使用execute方法直接執行SQL
records = session.execute(sql)

更多關于Python3 SQLAlchemy Sqlite3相關教程請查看下面的相關鏈接

您可能感興趣的文章:
  • python 操作sqlite數據庫的方法
  • python3 sqlite3限制條件查詢的操作
  • python sqlite3 判斷cursor的結果是否為空的案例
  • Python 操作SQLite數據庫的示例
  • python數據庫如何連接SQLite詳解

標簽:平頂山 哈爾濱 大慶 烏蘭察布 郴州 烏蘭察布 合肥 海南

巨人網絡通訊聲明:本文標題《Python3+SQLAlchemy+Sqlite3實現ORM教程》,本文關鍵詞  Python3+SQLAlchemy+Sqlite3,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python3+SQLAlchemy+Sqlite3實現ORM教程》相關的同類信息!
  • 本頁收集關于Python3+SQLAlchemy+Sqlite3實現ORM教程的相關信息資訊供網民參考!
  • 推薦文章
    在线播放免费视频| 青青草福利视频| 国产一区二区三区免费看| 欧美成人h版在线观看| 三级黄色录像视频| 一本久久综合亚洲鲁鲁五月天| 一区二区三区黄色| 亚洲精品久久久久久久蜜桃臀| 91丨九色丨海角社区| 成人黄色片视频网站| 成人一区二区三区| 亚洲激情一区二区| 午夜精品一区在线观看| 国内爆初菊对白视频| 黑鬼大战白妞高潮喷白浆| 国产97在线亚洲| 欧美高清dvd| 久草视频在线观| 欧美国产日韩一区二区在线观看| 中文天堂在线播放| 欧美在线国产精品| 91视频国产观看| 久久精品影视伊人网| 黑人粗进入欧美aaaaa| 精品伊人久久久久7777人| 欧亚精品中文字幕| 中文字幕一区av| 能在线观看的av网站| 日韩欧美国产综合一区| 麻豆国产一区二区| 久久久久久无码精品大片| 欧在线一二三四区| 国产一区二区丝袜| 久久久精品国产免费观看同学| 很污的网站在线观看| 欧美日韩亚洲精品内裤| 国产一区在线观看免费| 欧美精品久久久久久久久久| 欧美精品久久久久久久久25p| 久久电影网电视剧免费观看| 久久躁日日躁aaaaxxxx| 手机av免费观看| 免费拍拍拍网站| 色婷婷一区二区三区四区| 在线观看你懂的网站| 久久美女福利视频| 91欧美精品午夜性色福利在线| 日韩欧美视频在线| 秋霞电影网一区二区| 亚洲一区二区三区精品动漫| 亚洲激情五月婷婷| 九九热最新地址| 国产日韩精品入口| 波多野结衣喷潮| 日韩午夜在线观看视频| 国产情侣久久久久aⅴ免费| 日韩女同互慰一区二区| 国产精品一区二区91| 欧美性猛交内射兽交老熟妇| 精品毛片乱码1区2区3区| 粉嫩嫩av羞羞动漫久久久 | 精品免费久久久久久久| 日韩在线视频网站| 精品一区二区成人精品| 国产福利精品一区二区三区| 国内自拍欧美激情| 26uuu另类欧美| 久久草.com| 国产精品影视天天线| 九九热久久66| 国产精品―色哟哟| 国产在线一区二区综合免费视频| 国产精品嫩草影视| 久久久久久欧美精品色一二三四| 欧美变态口味重另类| av在线不卡电影| 一区二区三区麻豆| av日韩一区二区三区| 色欧美乱欧美15图片| 国产对白videos麻豆高潮| 在线观看日本一区| 国产丝袜欧美中文另类| 成年人看的免费视频| a视频免费观看| 欧美a在线视频| 国产成人亚洲欧美| 日韩欧美资源站| 日韩三级一区二区| 中文字幕免费高| 欧美国产极速在线| 欧美日韩一二三区| 亚洲第一天堂无码专区| 欧美wwwxxxx| 最近中文字幕mv在线一区二区三区四区| 亚洲精品大尺度| 国产午夜精品一区二区三区视频 | 亚洲综合在线免费观看| 美女福利视频在线| 亚洲欧美国产一区二区三区 | 亚洲精品久久久久久一区二区| 伊人久久精品视频| 悠悠色在线精品| 中文字幕在线看高清电影| 国产91美女视频| www.国产区| 99热成人精品热久久66| v8888av| 午夜成人亚洲理伦片在线观看| 久久精品欧美一区二区| 欧美日韩一区二区三区四区五区六区| 日韩不卡av| www国产精品com| 色综合久久久网| 国产精品伦理一区二区| 麻豆视频在线观看| 日本一区二区免费高清视频| 久久久久国产精品一区| 国产精品一区二区三区毛片淫片 | 亚洲日本护士毛茸茸| www.se五月| 男人天堂成人网| 麻豆一区区三区四区产品精品蜜桃| 日韩高清三级| 亚洲天堂成人av| 黄色片网站在线免费观看| 国产美女三级无套内谢| 91午夜视频在线观看| 亚洲午夜精品久久| 日韩av免费一区| 久久视频国产精品免费视频在线| 欧美美女视频在线观看| 欧美日韩国产黄| 久久精品99北条麻妃| 精人妻一区二区三区| 国产精品自在自线| 国产精品揄拍100视频| 精品一区2区三区| 国产在线观看一区二区三区 | 日韩一区二区在线看| 日韩一级片网址| 欧美天天综合色影久久精品| 亚洲欧美日韩久久| 国产成人精品亚洲777人妖| 麻豆精品视频在线观看视频| 中文av字幕在线观看| 日本少妇xxxx软件| 日本午夜精品一区二区三区| 婷婷综合激情网| 国模杨依粉嫩蝴蝶150p| 久久久久999| 国产丝袜在线精品| 日韩精品一卡二卡| 国产对白在线播放| 亚洲欧美日韩在线高清直播| 粉嫩aⅴ一区二区三区四区五区 | 国产精品视频一区二区三区,| 日本欧美视频在线观看| 美女福利视频一区| 国产精品全国免费观看高清 | 女人高潮一级片| 日韩暖暖在线视频| 五月婷婷久久丁香| 亚洲av无码国产精品久久不卡| 中文字幕第100页| 国产91在线播放九色快色| 欧美日韩综合视频网址| 日韩在线观看视频一区| 日本人妻一区二区三区| 99久久自偷自偷国产精品不卡| 91精品国产综合久久久久久久 | 国产精品日日摸夜夜添夜夜av| 天天色图综合网| 好吊视频一二三区| 捆绑裸体绳奴bdsm亚洲| 狠狠色综合色区| 亚洲美女av电影| 国产美女裸体无遮挡免费视频| 国产自产2019最新不卡| 国产夫妻自拍av| 亚洲美女黄色片| www.99精品| 日韩乱码在线观看| 日韩欧美一区二| 日韩av电影在线网| 在线亚洲一区观看| 国产美女主播视频一区| 久久精品视频免费在线观看| 激情视频小说图片| 午夜精品福利电影| 色国产精品一区在线观看| 老牛国产精品一区的观看方式| 中文字幕av网址| 五月天男人天堂| 午夜精品福利在线观看| 欧美性受极品xxxx喷水| 国产成人综合自拍| 中文在线第一页| 国产美女视频免费看| 精品国产福利| 九九九热精品免费视频观看网站| 午夜成人免费电影| 久久精品国产精品青草| 国产性xxxx高清| jizz欧美性11| 久久婷婷开心| 欧美—级高清免费播放| 欧美特级限制片免费在线观看| 国产成人在线观看| 无码人妻aⅴ一区二区三区有奶水| 天天干天天色天天干| 欧美二级三级| 午夜精品久久久久久久白皮肤 | 日韩专区一卡二卡| 欧美日韩在线视频免费播放| 久久黄色免费看| 国产原创精品| 久久久久免费精品国产| 日韩欧美视频一区| 自拍偷在线精品自拍偷无码专区 | 国产91丝袜在线18| 一级片在线免费播放| 日韩欧美在线视频观看| 亚洲高清久久网| 催眠调教后宫乱淫校园| 日韩欧美亚洲日产国产| 日本一区二区三区在线播放| 精品sm捆绑视频| 一区二区三区在线视频观看| 精品一区二区日韩| 在线视频免费观看一区| www.黄色com| 久久久精品高清| 男插女免费视频| av色综合网| 91高清免费视频| 亚洲一二在线观看| 欧美三日本三级三级在线播放| 中文字幕精品三区| 久久99久久99| 国产成人免费看一级大黄| 欧美日韩精品在线观看视频 | 国产精品二三区| 精品一区二区三区av| 亚洲精品国产av| 日日夜夜狠狠操| 日本激情视频一区二区三区| 青青草精品在线| 波多野结衣家庭教师在线| 特级西西444www大精品视频| 成人字幕网zmw| 88xx成人精品| 久久久国产影院| 亚洲精品美女久久久| 欧美日韩不卡一区二区| 夜夜精品视频一区二区| 欧美激情中文不卡| 国产成人精品www牛牛影视| 亚洲欧美综合一区二区| 国产精品区在线观看| 69视频免费在线观看| 26uuu成人网| 国产中年熟女高潮大集合| 波多野结衣三级视频| 中文字幕第36页| 国产精品999视频| 青青草综合视频| 一本一道久久a久久精品综合 | 色综合男人天堂| 中文字幕视频一区二区在线有码| 欧美大胆人体bbbb| 欧美日韩电影在线播放| 色综合网色综合| 亚洲成人免费视频| 亚洲美女免费在线| 亚洲色图欧洲色图婷婷| 中文字幕欧美三区| 欧美激情资源网| 国产女同性恋一区二区| 久久午夜老司机| 国产亚洲精品中文字幕| 久久伊人中文字幕| 久久综合一区二区| 97精品电影院| 久久丝袜美腿综合| 国产亚洲一区二区三区| 久久免费美女视频| 久久久久久免费| 欧美激情一区二区三区四区| 亚洲国产高清在线观看视频| 欧美国产日产图区| 国产精品久久久久久久久晋中 | 一区二区三区四区免费视频| 麻豆传媒一区| 日韩资源av在线| 成年人免费观看的视频| 一区二区三区电影| 日本免费成人网| 欧美亚洲精品一区二区| 日韩欧美xxxx| 色婷婷一区二区三区在线观看| 午夜影院免费版| av漫画在线观看| 瑟瑟视频在线观看| 国产日产精品一区二区三区的介绍| 国产人与禽zoz0性伦| 国产一级生活片| 天天干天天操天天操| 国产精品自偷自拍| 午夜18视频在线观看| 丝袜美腿亚洲综合| 国产一区二区三区精品欧美日韩一区二区三区 | 青娱乐国产精品视频| 9.1在线观看免费| x88av在线| 久久精品国产亚洲av高清色欲| 无码人妻av一区二区三区波多野| 999免费视频| 日韩中文字幕一区二区三区| 国产伦精品一区二区三区免费迷 | 亚洲欧美二区三区| 婷婷综合久久一区二区三区| 欧美日韩国产首页在线观看| 精品成人一区二区| 久久精品国产一区| 国产激情久久久久| 国产一区二区三区高清| 正在播放精油久久| 国产精品后入内射日本在线观看| 91小视频在线播放| 91视频免费在观看| 六月丁香激情综合| 亚洲精品一区二区三区区别| 麻豆精品国产91久久久久久| 久久看人人爽人人| 欧美日韩国产专区| 欧美mv日韩mv亚洲| 久久夜色精品亚洲噜噜国产mv| 国产精品成人aaaaa网站| 国产一区免费在线观看| 999一区二区三区| 国产黄色一区二区三区| 天天操天天舔天天射| 亚洲欧美偷拍一区| 可以看毛片的网址| 亚洲一级二级在线| 99久久国产宗和精品1上映| 国产综合香蕉五月婷在线| 欧美性大战久久久久| 欧美在线一区视频| 日本在线不卡一区二区| 精品少妇久久久| 亚洲精品国产手机| 国产风韵犹存在线视精品| 亚洲人成网站色在线观看| 91超碰这里只有精品国产| 日韩在线播放一区| 91色精品视频在线| 日韩欧美视频免费在线观看| 黄色a级三级三级三级| 欧美成人精品激情在线视频| jizz中国女人| 91视频观看免费| 在线视频你懂得一区二区三区| 亚洲欧美日韩国产中文| 国产精品爱久久久久久久| 亚洲欧美日韩精品久久久| 男插女视频网站| 中文字幕第15页| 精品亚洲成a人| 亚洲一区二区在线视频| 亚洲精品日韩久久久| 国产精品欧美激情| 伊人久久在线观看| 国内精品久久99人妻无码| 欧美男人天堂网| 成人精品视频一区二区三区尤物| 狠狠久久亚洲欧美专区| 丝袜亚洲欧美日韩综合| 51成人做爰www免费看网站| www国产黄色| 亚洲最大的黄色网址| 亚洲 欧美 激情 另类| 亚洲欧美一区二区三区极速播放 | 国产精品wwwww| 顶臀精品视频www| 麻豆久久久久久| 偷窥国产亚洲免费视频| 欧美成人第一页| 亚洲欧美日韩不卡一区二区三区| 91传媒理伦片在线观看| 91在线精品入口| 久久综合九色综合久久久精品综合| 欧美日韩亚洲国产综合| 国产91精品久久久久| 日本高清视频免费在线观看| 女女互磨互喷水高潮les呻吟| 国产 日韩 欧美 综合| 亚洲女同一区二区| 色诱女教师一区二区三区| 欧美日韩成人一区二区三区 | 国产1区2区在线观看| 亚洲第一精品网站| 国产精品久久网站| 亚洲欧美在线播放| 久久riav| 波多野在线播放| 麻豆成人av在线| 欧美一区午夜精品| 99视频免费观看| 黄色av网址在线观看|