婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > 用 Python 元類的特性實(shí)現(xiàn) ORM 框架

用 Python 元類的特性實(shí)現(xiàn) ORM 框架

熱門標(biāo)簽:富錦商家地圖標(biāo)注 沈陽人工外呼系統(tǒng)價(jià)格 沈陽防封電銷卡品牌 池州外呼調(diào)研線路 武漢外呼系統(tǒng)平臺(tái) 外呼系統(tǒng)哪些好辦 沈陽外呼系統(tǒng)呼叫系統(tǒng) 江西省地圖標(biāo)注 如何申請(qǐng)400電話費(fèi)用

ORM是什么

O是 object,也就 類對(duì)象 的意思,R是 relation,翻譯成中文是 關(guān)系,也就是關(guān)系數(shù)據(jù)庫中 數(shù)據(jù)表 的意思,M是 mapping,是映射的意思。在ORM框架中,它幫我們把類和數(shù)據(jù)表進(jìn)行了一個(gè)映射,可以讓我們通過類和類對(duì)象就能操作它所對(duì)應(yīng)的表格中的數(shù)據(jù)。ORM框架還有一個(gè)功能,它可以根據(jù)我們?cè)O(shè)計(jì)的類自動(dòng)幫我們生成數(shù)據(jù)庫中的表,省去了我們自己建表的過程。

一個(gè)句話理解就是:創(chuàng)建一個(gè)實(shí)例對(duì)象,用創(chuàng)建它的類名當(dāng)做數(shù)據(jù)表名,用創(chuàng)建它的類屬性對(duì)應(yīng)數(shù)據(jù)表的字段,當(dāng)對(duì)這個(gè)實(shí)例對(duì)象操作時(shí),能夠?qū)?yīng) MySQL 語句。

在 Django 中就內(nèi)嵌了一個(gè) ORM 框架,不需要直接面向數(shù)據(jù)庫編程,而是定義模型類,通過模型類和對(duì)象完成數(shù)據(jù)表的增刪改查操作。還有第三方庫 sqlalchemy 都是 ORM框架。

先看看我們大致要實(shí)現(xiàn)什么功能

class User(父類省略):
    uid = ('uid', "int unsigned")
    name = ('username', "varchar(30)")
    email = ('email', "varchar(30)")
    password = ('password', "varchar(30)")
    ...省略...


user = User(uid=123, name='hui', email='huidbk@163.com', password='123456')
user.save()

# 對(duì)應(yīng)如下sql語句
# insert into User (uid,username,email,password) values (123,hui,huidbk@163.com,123456)

所謂的 ORM 就是讓開發(fā)者在操作數(shù)據(jù)庫的時(shí)候,能夠像操作對(duì)象時(shí)通過xxxx.屬性=yyyy一樣簡單,這是開發(fā)ORM的初衷。

實(shí)現(xiàn)ORM中的insert功能

通過 Python 中 元類 簡單實(shí)現(xiàn) ORM 中的 insert 功能

# !/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author: Hui
# @Desc: { 利用Python元類簡單實(shí)現(xiàn)ORM框架的Insert插入功能 }
# @Date: 2021/05/17 17:02


class ModelMetaclass(type):
    """數(shù)據(jù)表模型元類"""

    def __new__(mcs, cls_name, bases, attrs):

        print(f'cls_name -> {cls_name}')    # 類名
        print(f'bases -> {bases}')          # 繼承類
        print(f'attrs -> {attrs}')          # 類中所有屬性
        print()

        # 數(shù)據(jù)表對(duì)應(yīng)關(guān)系字典
        mappings = dict()

        # 過濾出對(duì)應(yīng)數(shù)據(jù)表的字段屬性
        for k, v in attrs.items():
            # 判斷是否是指定的StringField或者IntegerField的實(shí)例對(duì)象
            # 這里就簡單判斷字段是元組
            if isinstance(v, tuple):
                print('Found mapping: %s ==> %s' % (k, v))
                mappings[k] = v

        # 刪除這些已經(jīng)在字典中存儲(chǔ)的字段屬性
        for k in mappings.keys():
            attrs.pop(k)

        # 將之前的uid/name/email/password以及對(duì)應(yīng)的對(duì)象引用、類名字
        # 用其他類屬性名稱保存
        attrs['__mappings__'] = mappings  # 保存屬性和列的映射關(guān)系
        attrs['__table__'] = cls_name     # 假設(shè)表名和類名一致
        return type.__new__(mcs, cls_name, bases, attrs)


class User(metaclass=ModelMetaclass):
    """用戶模型類"""
	# 類屬性名    表字段    表字段類型
    uid =      ('uid', 'int unsigned')
    name =     ('username', 'varchar(30)')
    email =    ('email', 'varchar(30)')
    password = ('password', 'varchar(30)')

    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

    def save(self):
        fields = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v[0])
            args.append(getattr(self, k, None))

        # 表名
        table_name = self.__table__
        # 數(shù)據(jù)表中的字段
        fields = ','.join(fields)
        # 待插入的數(shù)據(jù)
        args = ','.join([str(i) for i in args])
        
        # 生成sql語句
        sql = f"""insert into {table_name} ({fields}) values ({args})"""
        print(f'SQL: {sql}')


def main():
    user = User(uid=123, name='hui', email='huidbk@163.com', password='123456')
    user.save()


if __name__ == '__main__':
    main()

當(dāng) User 指定元類之后,uid、name、email、password 類屬性將不在類中,而是在 __mappings__ 屬性指定的字典中存儲(chǔ)。 User 類的這些屬性將轉(zhuǎn)變?yōu)槿缦?/p>

__mappings__ = {
    "uid": ('uid', "int unsigned")
    "name": ('username', "varchar(30)")
    "email": ('email', "varchar(30)")
    "password": ('password', "varchar(30)")
}
__table__ = "User"

執(zhí)行的效果如下:

cls_name -> User
bases -> ()
attrs -> {
    '__module__': '__main__', '__qualname__': 'User', '__doc__': '用戶模型類', 
    'uid': ('uid', 'int unsigned'), 
    'name': ('username', 'varchar(30)'), 
    'email': ('email', 'varchar(30)'), 
    'password': ('password', 'varchar(30)'), 
    '__init__': function User.__init__ at 0x0000026D520C1048>, 
    'save': function User.save at 0x0000026D520C10D8>
}

Found mapping: uid ==> ('uid', 'int unsigned')
Found mapping: name ==> ('username', 'varchar(30)')
Found mapping: email ==> ('email', 'varchar(30)')
Found mapping: password ==> ('password', 'varchar(30)')

SQL: insert into User (uid,username,email,password) values (123,hui,huidbk@163.com,123456)

完善對(duì)數(shù)據(jù)類型的檢測(cè)

上面轉(zhuǎn)成的 sql 語句如下:

insert into User (uid,username,email,password) values (12345,hui,huidbk@163.com,123456)

發(fā)現(xiàn)沒有,在 sql 語句中字符串類型沒有沒有引號(hào) ''

正確的 sql 語句應(yīng)該是:

insert into User (uid,username,email,password) values (123, 'hui', 'huidbk@163.com', '123456')

因此修改 User 類完善數(shù)據(jù)類型的檢測(cè)

class ModelMetaclass(type):
    # 此處和上文一樣, 故省略....
    pass
    
class User(metaclass=ModelMetaclass):
    """用戶模型類"""

    uid = ('uid', "int unsigned")
    name = ('username', "varchar(30)")
    email = ('email', "varchar(30)")
    password = ('password', "varchar(30)")

    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

    # 在這里完善數(shù)據(jù)類型檢測(cè)
    def save(self):
        fields = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v[0])
            args.append(getattr(self, k, None))

        # 把參數(shù)數(shù)據(jù)類型對(duì)應(yīng)數(shù)據(jù)表的字段類型
        args_temp = list()
        for temp in args:
            if isinstance(temp, int):
                args_temp.append(str(temp))
            elif isinstance(temp, str):
                args_temp.append(f"'{temp}'")

        # 表名
        table_name = self.__table__
        # 數(shù)據(jù)表中的字段
        fields = ','.join(fields)
        # 待插入的數(shù)據(jù)
        args = ','.join(args_temp)

        # 生成sql語句
        sql = f"""insert into {table_name} ({fields}) values ({args})"""
        print(f'SQL: {sql}')


def main():
    user = User(uid=123, name='hui', email='huidbk@163.com', password='123456')
    user.save()


if __name__ == '__main__':
    main()

運(yùn)行效果如下:

cls_name -> User
bases -> ()
attrs -> {
    '__module__': '__main__', '__qualname__': 'User', '__doc__': '用戶模型類', 
    'uid': ('uid', 'int unsigned'), 
    'name': ('username', 'varchar(30)'), 
    'email': ('email', 'varchar(30)'), 
    'password': ('password', 'varchar(30)'), 
    '__init__': function User.__init__ at 0x0000026D520C1048>, 
    'save': function User.save at 0x0000026D520C10D8>
}

Found mapping: uid ==> ('uid', 'int unsigned')
Found mapping: name ==> ('username', 'varchar(30)')
Found mapping: email ==> ('email', 'varchar(30)')
Found mapping: password ==> ('password', 'varchar(30)')
    
SQL: insert into User (uid,username,email,password) values(123,'hui','huidbk@163.com','123456')

抽取到基類中

# !/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author: Hui
# @Desc: { 利用Python元類實(shí)現(xiàn)ORM框架的Insert插入功能 }
# @Date: 2021/05/17 17:02


class ModelMetaclass(type):
    """數(shù)據(jù)表模型元類"""

    def __new__(mcs, cls_name, bases, attrs):

        print(f'cls_name -> {cls_name}')  # 類名
        print(f'bases -> {bases}')  # 繼承類
        print(f'attrs -> {attrs}')  # 類中所有屬性
        print()

        # 數(shù)據(jù)表對(duì)應(yīng)關(guān)系字典
        mappings = dict()

        # 過濾出對(duì)應(yīng)數(shù)據(jù)表的字段屬性
        for k, v in attrs.items():
            # 判斷是否是對(duì)應(yīng)數(shù)據(jù)表的字段屬性, 因?yàn)閍ttrs中包含所有的類屬性
            # 這里就簡單判斷字段是元組
            if isinstance(v, tuple):
                print('Found mapping: %s ==> %s' % (k, v))
                mappings[k] = v

        # 刪除這些已經(jīng)在字典中存儲(chǔ)的字段屬性
        for k in mappings.keys():
            attrs.pop(k)

        # 將之前的uid/name/email/password以及對(duì)應(yīng)的對(duì)象引用、類名字
        # 用其他類屬性名稱保存
        attrs['__mappings__'] = mappings  # 保存屬性和列的映射關(guān)系
        attrs['__table__'] = cls_name  # 假設(shè)表名和類名一致
        return type.__new__(mcs, cls_name, bases, attrs)


class Model(object, metaclass=ModelMetaclass):
    """數(shù)據(jù)表模型基類"""

    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

    def save(self):
        fields = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v[0])
            args.append(getattr(self, k, None))

        # 把參數(shù)數(shù)據(jù)類型對(duì)應(yīng)數(shù)據(jù)表的字段類型
        args_temp = list()
        for temp in args:
            if isinstance(temp, int):
                args_temp.append(str(temp))
            elif isinstance(temp, str):
                args_temp.append(f"'{temp}'")

        # 表名
        table_name = self.__table__
        # 數(shù)據(jù)表中的字段
        fields = ','.join(fields)
        # 待插入的數(shù)據(jù)
        args = ','.join(args_temp)

        # 生成sql語句
        sql = f"""insert into {table_name} ({fields}) values ({args})"""
        print(f'SQL: {sql}')

        # 執(zhí)行sql語句
        # ...


class User(Model):
    """用戶表模型類"""

    uid = ('uid', "int unsigned")
    name = ('username', "varchar(30)")
    email = ('email', "varchar(30)")
    password = ('password', "varchar(30)")


def main():
    user = User(uid=123, name='hui', email='huidbk@163.com', password='123456')
    user.save()


if __name__ == '__main__':
    main()

添加數(shù)據(jù)庫驅(qū)動(dòng)執(zhí)行sql語句

這里我們使用 pymysql 數(shù)據(jù)庫驅(qū)動(dòng),來執(zhí)行 sql 語句

在 Model 類中新增一個(gè) get_connection 的靜態(tài)方法用于獲取數(shù)據(jù)庫連接

import pymysql


class Model(object, metaclass=ModelMetaclass):
    """數(shù)據(jù)表模型基類"""

    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

    @staticmethod
    def get_connection():
        """
        獲取數(shù)據(jù)庫連接與數(shù)據(jù)游標(biāo)
        :return: conn, cursor
        """
        conn = pymysql.connect(
            database='testdb',
            host='localhost',
            port=3306,
            user='root',
            password='123456'
        )
        return conn, conn.cursor()

    def save(self):
        fields = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v[0])
            args.append(getattr(self, k, None))

        # 把參數(shù)數(shù)據(jù)類型對(duì)應(yīng)數(shù)據(jù)表的字段類型
        args_temp = list()
        for temp in args:
            if isinstance(temp, int):
                args_temp.append(str(temp))
            elif isinstance(temp, str):
                args_temp.append(f"'{temp}'")

        # 表名
        table_name = self.__table__
        # 數(shù)據(jù)表中的字段
        fields = ','.join(fields)
        # 待插入的數(shù)據(jù)
        args = ','.join(args_temp)

        # 生成sql語句
        sql = f"""insert into {table_name} ({fields}) values ({args})"""
        print(f'SQL: {sql}')

        # 執(zhí)行sql語句
        conn, cursor = self.get_connection()
        ret = cursor.execute(sql)
        print(ret)
        conn.commit()
        cursor.close()
        conn.close()
        

添加數(shù)據(jù)庫驅(qū)動(dòng)執(zhí)行sql語句

這里我們使用 pymysql 數(shù)據(jù)庫驅(qū)動(dòng),來執(zhí)行 sql 語句

在 Model 類中新增一個(gè) get_connection 的靜態(tài)方法用于獲取數(shù)據(jù)庫連接

import pymysql


class Model(object, metaclass=ModelMetaclass):
    """數(shù)據(jù)表模型基類"""

    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

    @staticmethod
    def get_connection():
        """
        獲取數(shù)據(jù)庫連接與數(shù)據(jù)游標(biāo)
        :return: conn, cursor
        """
        conn = pymysql.connect(
            database='testdb',
            host='localhost',
            port=3306,
            user='root',
            password='123456'
        )
        return conn, conn.cursor()

    def save(self):
        fields = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v[0])
            args.append(getattr(self, k, None))

        # 把參數(shù)數(shù)據(jù)類型對(duì)應(yīng)數(shù)據(jù)表的字段類型
        args_temp = list()
        for temp in args:
            if isinstance(temp, int):
                args_temp.append(str(temp))
            elif isinstance(temp, str):
                args_temp.append(f"'{temp}'")

        # 表名
        table_name = self.__table__
        # 數(shù)據(jù)表中的字段
        fields = ','.join(fields)
        # 待插入的數(shù)據(jù)
        args = ','.join(args_temp)

        # 生成sql語句
        sql = f"""insert into {table_name} ({fields}) values ({args})"""
        print(f'SQL: {sql}')

        # 執(zhí)行sql語句
        conn, cursor = self.get_connection()
        ret = cursor.execute(sql)
        print(ret)
        conn.commit()
        cursor.close()
        conn.close()
        

測(cè)試功能

準(zhǔn)備數(shù)據(jù)庫

先準(zhǔn)備數(shù)據(jù)庫 testdb 和 user 數(shù)據(jù)表

create database testdb charset=utf8;

use testdb;

create table user(
	uid int unsigned auto_increment primary key,
	username varchar(30) not null,
	email varchar(30),
	password varchar(30) not null
);

user 表結(jié)構(gòu)如下

+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| uid      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(30)      | NO   |     | NULL    |                |
| email    | varchar(30)      | YES  |     | NULL    |                |
| password | varchar(30)      | NO   |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+

創(chuàng)建模型類測(cè)試

class User(Model):
    """用戶表模型類"""

    uid = ('uid', "int unsigned")
    name = ('username', "varchar(30)")
    email = ('email', "varchar(30)")
    password = ('password', "varchar(30)")


def main():
    user = User(uid=1, name='hui', email='huidbk@163.com', password='123456')
    user.save()

    for i in range(2, 10):
        user = User(
            uid=i,
            name=f'name{i}',
            email=f'huidbk@16{i}.com',
            password=f'12345{i}'
        )
        user.save()
    

if __name__ == '__main__':
    main()
    

查看數(shù)據(jù)庫 user 表數(shù)據(jù)

mysql> select * from user;
+-----+----------+----------------+----------+
| uid | username | email          | password |
+-----+----------+----------------+----------+
|   1 | hui      | huidbk@163.com | 123456   |
|   2 | name2    | huidbk@162.com | 123452   |
|   3 | name3    | huidbk@163.com | 123453   |
|   4 | name4    | huidbk@164.com | 123454   |
|   5 | name5    | huidbk@165.com | 123455   |
|   6 | name6    | huidbk@166.com | 123456   |
|   7 | name7    | huidbk@167.com | 123457   |
|   8 | name8    | huidbk@168.com | 123458   |
|   9 | name9    | huidbk@169.com | 123459   |
+-----+----------+----------------+----------+
9 rows in set (0.00 sec)

源代碼

源代碼已上傳到 Gitee PythonKnowledge: Python知識(shí)寶庫,歡迎大家來訪。

以上就是用 Python 元類的特性實(shí)現(xiàn) ORM 框架的詳細(xì)內(nèi)容,更多關(guān)于Python 實(shí)現(xiàn) ORM 框架的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Python Django ORM連表正反操作技巧
  • 如何使用Python實(shí)現(xiàn)一個(gè)簡易的ORM模型
  • python 實(shí)現(xiàn)format進(jìn)制轉(zhuǎn)換與刪除進(jìn)制前綴
  • Python3+SQLAlchemy+Sqlite3實(shí)現(xiàn)ORM教程
  • Python的輕量級(jí)ORM框架peewee使用教程
  • Python通過format函數(shù)格式化顯示值
  • python利用platform模塊獲取系統(tǒng)信息
  • Python colormap庫的安裝和使用詳情
  • python中format函數(shù)如何使用
  • Python自定義聚合函數(shù)merge與transform區(qū)別詳解
  • python orm 框架中sqlalchemy用法實(shí)例詳解
  • python用sqlacodegen根據(jù)已有數(shù)據(jù)庫(表)結(jié)構(gòu)生成對(duì)應(yīng)SQLAlchemy模型

標(biāo)簽:黑龍江 通遼 銅川 株洲 潛江 呂梁 阿里 常德

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《用 Python 元類的特性實(shí)現(xiàn) ORM 框架》,本文關(guān)鍵詞  用,Python,元類,的,特性,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《用 Python 元類的特性實(shí)現(xiàn) ORM 框架》相關(guān)的同類信息!
  • 本頁收集關(guān)于用 Python 元類的特性實(shí)現(xiàn) ORM 框架的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美中文一区二区三区| 日韩一区精品字幕| 91色婷婷久久久久合中文| 国产精品电影一区二区| 97久久精品人人澡人人爽| 亚洲欧美日韩系列| 在线观看成人免费视频| 日韩成人免费电影| 精品88久久久久88久久久| 国产精品一区二区三区网站| 国产精品久久久久一区| 欧美亚洲综合另类| 久久精品国产亚洲一区二区三区| 久久久久久久久久久久电影| 成人精品视频一区二区三区 | 国产午夜精品久久久久久久| 国产电影精品久久禁18| 亚洲精品第1页| 日韩欧美www| 成人av电影免费观看| 一区二区三区不卡在线观看| 91精品国产欧美日韩| 国产69精品久久777的优势| 一区二区三区四区在线播放| 欧美电视剧免费观看| 成人免费视频app| 性久久久久久久久久久久| 久久一区二区三区四区| 在线观看免费亚洲| 国产精品一色哟哟哟| 亚洲永久免费视频| 欧美精品一区二区精品网| 91在线观看美女| 免费成人美女在线观看| 亚洲欧美影音先锋| 欧美电视剧在线观看完整版| 一本久久a久久精品亚洲| 黄页网站大全一区二区| 亚洲卡通欧美制服中文| 26uuu国产在线精品一区二区| 91在线精品一区二区| 男男gaygay亚洲| 亚洲一区二区欧美激情| 久久久精品中文字幕麻豆发布| 欧美日韩的一区二区| jlzzjlzz欧美大全| 国产一区二区三区免费播放 | 亚洲欧美日韩在线不卡| 精品蜜桃在线看| 欧美高清视频不卡网| 在线这里只有精品| 不卡的av中国片| 国产高清久久久| 国产一区二区三区在线观看精品| 日韩专区一卡二卡| 亚洲电影你懂得| 亚洲日本一区二区三区| 欧美经典三级视频一区二区三区| 精品国产伦一区二区三区免费 | 欧美综合天天夜夜久久| 国产99久久久精品| 国产在线国偷精品免费看| 美女在线一区二区| 免费成人在线网站| 日韩成人伦理电影在线观看| 婷婷夜色潮精品综合在线| 亚洲综合久久av| 亚洲午夜三级在线| 一区二区成人在线观看| 日韩美女久久久| 亚洲人一二三区| 亚洲免费观看高清完整 | 亚洲午夜免费电影| 亚洲女同ⅹxx女同tv| 亚洲欧美日韩在线播放| 一区二区三区精品视频| 亚洲蜜臀av乱码久久精品 | 亚洲视频图片小说| 成人免费一区二区三区在线观看| 国产精品美日韩| 国产精品色一区二区三区| 国产精品的网站| 樱花草国产18久久久久| 亚洲一级在线观看| 天天综合色天天综合| 麻豆视频观看网址久久| 国产尤物一区二区| 高清日韩电视剧大全免费| 福利91精品一区二区三区| 99vv1com这只有精品| 91国偷自产一区二区三区观看| 欧美日韩一二三| 精品日韩一区二区三区| 久久色在线视频| 亚洲色图欧美偷拍| 午夜欧美电影在线观看| 激情五月激情综合网| 不卡一区二区三区四区| 欧美日韩一区国产| 欧美mv日韩mv国产网站| 国产欧美一区二区精品秋霞影院 | 精品一区二区在线视频| 成人免费毛片高清视频| 欧美性猛片aaaaaaa做受| 日韩视频免费观看高清完整版| 久久一区二区三区四区| 亚洲精品中文在线观看| 蜜臀av在线播放一区二区三区| 国产精品一级二级三级| 91麻豆成人久久精品二区三区| 欧美日韩在线播放三区| 精品sm捆绑视频| 伊人性伊人情综合网| 蜜臀99久久精品久久久久久软件| 成人国产精品视频| 欧美喷潮久久久xxxxx| 国产欧美日韩一区二区三区在线观看| 一级中文字幕一区二区| 狠狠色丁香久久婷婷综合_中 | 亚洲久草在线视频| 久草热8精品视频在线观看| 色婷婷狠狠综合| 精品国产1区2区3区| 亚洲一区国产视频| 东方aⅴ免费观看久久av| 69p69国产精品| 亚洲欧洲国产日韩| 狠狠狠色丁香婷婷综合久久五月| 欧美性猛片aaaaaaa做受| 亚洲国产精华液网站w| 日韩成人精品视频| 欧洲一区二区三区在线| 欧美激情一区二区三区在线| 日韩精品午夜视频| 91福利精品视频| 亚洲欧美综合色| 国产成人午夜精品5599| 欧美zozozo| 免费观看30秒视频久久| 欧美私模裸体表演在线观看| 中文字幕中文字幕在线一区| 韩国av一区二区三区四区| 制服.丝袜.亚洲.另类.中文| 亚洲精品v日韩精品| 成人免费精品视频| 欧美韩国一区二区| 国产一区二区不卡| 欧美r级电影在线观看| 免费视频最近日韩| 欧美日韩mp4| 五月婷婷综合在线| 欧美吞精做爰啪啪高潮| 亚洲男同性视频| 99综合影院在线| 国产精品美女久久久久av爽李琼 | 成人免费高清在线| 日本一区二区三区高清不卡| 国内一区二区在线| 久久综合久久综合久久综合| 美女精品自拍一二三四| 日韩欧美国产电影| 久久精品国产77777蜜臀| 欧美一区二区三区四区视频 | 亚洲国产精品久久不卡毛片 | 91麻豆精品国产91久久久久久 | 91在线精品一区二区三区| 国产精品久久久久影视| 成人精品亚洲人成在线| 亚洲同性gay激情无套| 93久久精品日日躁夜夜躁欧美| 自拍偷拍欧美激情| 在线日韩av片| 丝袜美腿亚洲一区| 欧美成人三级电影在线| 国产乱人伦偷精品视频免下载 | 色综合久久综合网97色综合| 中文字幕一区二区三区蜜月| 91在线你懂得| 亚洲国产精品久久人人爱| 91精品国产色综合久久不卡电影| 老司机精品视频一区二区三区| 久久你懂得1024| 91在线视频在线| 午夜激情久久久| 久久久国产午夜精品| www.成人在线| 图片区日韩欧美亚洲| 欧美精品一区二区久久久| www.欧美色图| 日韩高清国产一区在线| 国产欧美精品一区aⅴ影院 | 91精品国产综合久久精品性色| 免费在线观看成人| 亚洲欧洲国产专区| 日韩午夜在线观看视频| 成人深夜在线观看| 日本亚洲最大的色成网站www| 国产日韩综合av| 欧美日韩一二区| 成人综合在线视频|