精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Prisma.js:JavaScript中的代碼優(yōu)先ORM

譯文
開發(fā) 前端
用戶可以親身體驗(yàn)一下行業(yè)領(lǐng)先的JavaScript對象關(guān)系映射工具,可以將其與MongoDB和傳統(tǒng)數(shù)據(jù)庫一起使用。

譯者 | 李睿

審校 | 重樓

Prisma是一個流行的對象關(guān)系映射(ORM)工具,用于服務(wù)器端的JavaScript和TypeScript。其核心目的是簡化和自動化數(shù)據(jù)在存儲和應(yīng)用程序代碼之間的移動方式。Prisma支持廣泛的數(shù)據(jù)存儲,并為數(shù)據(jù)持久性提供了一個強(qiáng)大而靈活的抽象層。通過這個代碼優(yōu)先之旅,可以了解Prisma及其一些核心功能。

JavaScript的ORM層

對象關(guān)系映射(ORM)是由Java中的Hibernate框架首創(chuàng)的。對象-關(guān)系映射的最初目標(biāo)是克服Java類和RDBMS表之間所謂的阻抗不匹配。從這個想法中產(chǎn)生了更廣泛的應(yīng)用程序通用持久層的概念。Prisma是Java ORM層的一個基于JavaScript的現(xiàn)代進(jìn)化。

Prisma支持一系列SQL數(shù)據(jù)庫,并已擴(kuò)展到包括NoSQL數(shù)據(jù)存儲MongoDB。無論數(shù)據(jù)存儲的類型如何,它們的首要目標(biāo)都是:為應(yīng)用程序提供處理數(shù)據(jù)持久性的標(biāo)準(zhǔn)化框架。

域模型

以下將使用一個簡單的域模型來查看數(shù)據(jù)模型中的幾種關(guān)系:多對一、一對多和多對多 (在這里忽略一對一,因?yàn)榕c多對一非常相似) 。

Prisma使用模型定義(模式)作為應(yīng)用程序和數(shù)據(jù)存儲之間的樞紐。在構(gòu)建應(yīng)用程序時,將在這里采用的一種方法是從這個定義開始,然后從中構(gòu)建代碼。Prisma自動將模式應(yīng)用于數(shù)據(jù)存儲。

Prisma模型定義格式不難理解,可以使用圖形工具Prismbuilder來創(chuàng)建一個模型。而模型將支持協(xié)作的想法開發(fā)應(yīng)用程序,因此將有用戶(User)、想法(Idea)和標(biāo)簽(Tag)模型。一個用戶可以有多個想法(一對多),為一個想法提供一個用戶,而所有者(Owner)則有多個想法(多對一)。想法和標(biāo)簽形成了多對多的關(guān)系。清單1顯示了模型定義。

清單1.Prisma中的模型定義

datasource db {
 provider = "sqlite"
 url = "file:./dev.db"
}
generator client {
 provider = "prisma-client-js"
}
model User {
 id Int @id @default(autoincrement())
 name String
 email String @unique
 ideas Idea[]
}
model Idea {
 id Int @id @default(autoincrement())
 name String
 description String
 owner User @relation(fields: [ownerId], references: [id])
 ownerId Int
 tags Tag[]
}
model Tag {
 id Int @id @default(autoincrement())
 name String @unique
 ideas Idea[]

清單1包括一個數(shù)據(jù)源定義(一個簡單的SQLite數(shù)據(jù)庫,Prisma為了開發(fā)目的將其包含在內(nèi))和一個客戶端定義,“生成器客戶端”設(shè)置為Prisma-client-js。后者意味著Prisma將生成一個JavaScript客戶端,應(yīng)用程序可以使用它與定義創(chuàng)建的映射進(jìn)行交互。

至于模型定義,需要注意每個模型都有一個id字段,并且正在使用Prisma @default(autoincrement())注釋來獲得一個自動遞增的整數(shù)id。

為了創(chuàng)建從用戶(User)到想法(Idea)的關(guān)系,采用數(shù)組括號引用Idea類型:Idea[]。這句話的意思是:給一些用戶的想法。在關(guān)系的另一端,為想法(Idea)提供一個用戶(User): owner User @relation(字段:[ownerId],引用:[id])。

除了關(guān)系和鍵ID字段之外,字段定義也很簡單;字符串對應(yīng)字符串,等等。

創(chuàng)建項(xiàng)目

在這里將使用一個簡單的項(xiàng)目來使用Prisma的功能。第一步是創(chuàng)建一個新的Node.js項(xiàng)目并向其添加依賴項(xiàng)。之后,可以添加清單1中的定義,并使用它來處理Prisma內(nèi)置SQLite數(shù)據(jù)庫的數(shù)據(jù)持久性。

要啟動應(yīng)用程序,將創(chuàng)建一個新目錄,初始化一個npm項(xiàng)目,并安裝依賴項(xiàng),如清單2所示。

清單2.創(chuàng)建應(yīng)用程序

mkdir iw-prisma
cd iw-prisma
npm init -y
npm install express @prisma/client body-parser
mkdir prisma
touch prisma/schema.prisma

現(xiàn)在,在prisma/schema上創(chuàng)建一個文件。并添加清單1中的定義。接下來,告訴Prisma為SQLite準(zhǔn)備一個模式,如清單3所示。

清單3.設(shè)置數(shù)據(jù)庫

npx prisma migrate dev --name init
npx prisma migrate deploy

清單3告訴Prisma“遷移”數(shù)據(jù)庫,這意味著將模式更改從Prisma定義應(yīng)用到數(shù)據(jù)庫本身。dev標(biāo)志告訴Prisma使用開發(fā)概要文件,而--name為更改提供了一個任意名稱。deploy標(biāo)志告訴prisma應(yīng)用更改。

使用數(shù)據(jù)

現(xiàn)在,允許在Express.js中使用RESTful端點(diǎn)創(chuàng)建用戶。可以在清單4中看到服務(wù)器的代碼,它位于inw -prisma/server.js文件中。清單4是普通的Express代碼,但是由于有了Prisma,可以用最少的精力對數(shù)據(jù)庫做很多工作。

清單4.Express代碼

const express = require('express');
const bodyParser = require('body-parser');
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
const app = express();
app.use(bodyParser.json());
const port = 3000;
app.listen(port, () => {
 console.log(`Server is listening on port ${port}`);
});
// Fetch all users
app.get('/users', async (req, res) => {
 const users = await prisma.user.findMany();
 res.json(users);
});
// Create a new user
app.post('/users', async (req, res) => {
 const { name, email } = req.body;
 const newUser = await prisma.user.create({ data: { name, email } });
 res.status(201).json(newUser);
});

目前,只有兩個端點(diǎn),/usersGET用于獲取所有用戶的列表,/userPOST用于添加它們。通過分別調(diào)用Prisma.user.findMany()和Prisma.uuser.create(),可以看到可以多么容易地使用Prisma客戶端來處理這些用例。

不帶任何參數(shù)的findMany()方法將返回數(shù)據(jù)庫中的所有行。create()方法接受一個對象,該對象帶有一個數(shù)據(jù)字段,其中包含新行的值(在本例中是名稱和電子郵件—記住Prisma將自動創(chuàng)建一個唯一的ID)。

現(xiàn)在可以使用:node server.js運(yùn)行服務(wù)器。

使用CURL進(jìn)行測試

以下使用CURL測試端點(diǎn),如清單5所示。

清單5.使用CURL嘗試端點(diǎn)

$ curl http://localhost:3000/users
[]
$ curl -X POST -H "Content-Type: application/json" -d '{"name":"George Harrison","email":"george.harrison@example.com"}' http://localhost:3000/users
{"id":2,"name":"John Doe","email":"john.doe@example.com"}{"id":3,"name":"John Lennon","email":"john.lennon@example.com"}{"id":4,"name":"George Harrison","email":"george.harrison@example.com"}
$ curl http://localhost:3000/users
[{"id":2,"name":"John Doe","email":"john.doe@example.com"},{"id":3,"name":"John Lennon","email":"john.lennon@example.com"},{"id":4,"name":"George Harrison","email":"george.harrison@example.com"}]

清單5顯示了獲取所有用戶并找到一個空集,然后添加用戶,獲取填充的集。

接下來添加一個端點(diǎn),它允許創(chuàng)建想法并將它們與用戶關(guān)聯(lián)起來,如清單6所示。

清單6. User ideas POST endpoint

app.post('/users/:userId/ideas', async (req, res) => {
 const { userId } = req.params;
 const { name, description } = req.body;
 try {
 const user = await prisma.user.findUnique({ where: { id: parseInt(userId) } });
 if (!user) {
 return res.status(404).json({ error: 'User not found' });
 }
 const idea = await prisma.idea.create({
 data: {
 name,
 description,
 owner: { connect: { id: user.id } },
 },
 });
 res.json(idea);
 } catch (error) {
 console.error('Error adding idea:', error);
 res.status(500).json({ error: 'An error occurred while adding the idea' });
 }
});
app.get('/userideas/:id', async (req, res) => {
 const { id } = req.params;
 const user = await prisma.user.findUnique({
 where: { id: parseInt(id) },
 include: {
 ideas: true,
 },
 });
 if (!user) {
 return res.status(404).json({ message: 'User not found' });
 }
 res.json(user);
});

在清單6中有兩個端點(diǎn)。第一個允許使用POST在/users/:userId/ideas添加一個想法。它需要做的第一件事是使用prism .user. findunique()通過ID恢復(fù)用戶。這個方法用于根據(jù)傳入的標(biāo)準(zhǔn)在數(shù)據(jù)庫中查找單個實(shí)體。在本例中,希望用戶具有來自請求的ID,因此使用:{where:{ID:prseInt(userId)}}。

一旦有了用戶,就使用prisma.idea.create來創(chuàng)建一個新的想法。這就像創(chuàng)建用戶時一樣,但現(xiàn)在有了一個關(guān)系字段。Prisma可以創(chuàng)建新想法和用戶之間的關(guān)聯(lián):owner:{connect:{id:user.id}}。

第二個端點(diǎn)是/userideas/:id的GET。這個端點(diǎn)的目的是獲取用戶ID并返回用戶,包括他們的想法。可以看到與findUnique調(diào)用一起使用的where子句,以及include修飾符。這里使用修飾符來告訴Prisma包含相關(guān)的想法。如果沒有這一點(diǎn),就不會包含這些想法,因?yàn)镻risma默認(rèn)使用延遲加載關(guān)聯(lián)獲取策略。

要測試新的端點(diǎn),可以使用清單7中所示的CURL命令。

清單7.用于測試端點(diǎn)的CURL

$ curl -X POST -H "Content-Type: application/json" -d '{"name":"New Idea", "description":"Idea description"}' http://localhost:3000/users/3/ideas
$ curl http://localhost:3000/userideas/3
{"id":3,"name":"John Lennon","email":"john.lennon@example.com","ideas":[{"id":1,"name":"New Idea","description":"Idea description","ownerId":3},{"id":2,"name":"New Idea","description":"Idea description","ownerId":3}]}

能夠添加想法并用它們恢復(fù)用戶。

帶標(biāo)簽的多對多

現(xiàn)在添加端點(diǎn)來處理多對多關(guān)系中的標(biāo)簽。在清單8中,處理標(biāo)簽的創(chuàng)建,并將標(biāo)簽(Tag)和想法(Ideas)關(guān)聯(lián)起來。

清單8.添加和顯示標(biāo)簽

// create a tag
app.post('/tags', async (req, res) => {
 const { name } = req.body;
 try {
 const tag = await prisma.tag.create({
 data: {
 name,
 },
 });
 res.json(tag);
 } catch (error) {
 console.error('Error adding tag:', error);
 res.status(500).json({ error: 'An error occurred while adding the tag' });
 }
});
// Associate a tag with an idea
app.post('/ideas/:ideaId/tags/:tagId', async (req, res) => {
 const { ideaId, tagId } = req.params;
 try {
 const idea = await prisma.idea.findUnique({ where: { id: parseInt(ideaId) } });
 if (!idea) {
 return res.status(404).json({ error: 'Idea not found' });
 }
 const tag = await prisma.tag.findUnique({ where: { id: parseInt(tagId) } });
 if (!tag) {
 return res.status(404).json({ error: 'Tag not found' });
 }
 const updatedIdea = await prisma.idea.update({
 where: { id: parseInt(ideaId) },
 data: {
 tags: {
 connect: { id: tag.id },
 },
 },
 });
 res.json(updatedIdea);
 } catch (error) {
 console.error('Error associating tag with idea:', error);
 res.status(500).json({ error: 'An error occurred while associating the tag with the idea' });
 }
});

在這里增加了兩個端點(diǎn)。用于添加標(biāo)簽的POST端點(diǎn)與前面的示例很相似。在清單8中,還添加了POST端點(diǎn),用于將想法與標(biāo)簽關(guān)聯(lián)起來。

為了將一個想法(Idea)和一個標(biāo)簽(Tag)關(guān)聯(lián)起來,利用了模型定義中的多對多映射。通過ID抓取想法和標(biāo)簽,并使用關(guān)聯(lián)(Connect)字段將它們相互聯(lián)系來。現(xiàn)在,想法在它的標(biāo)簽集合中有標(biāo)簽ID,反之亦然。多對多關(guān)聯(lián)允許最多兩個一對多關(guān)系,每個實(shí)體指向另一個實(shí)體。在數(shù)據(jù)存儲中,這需要創(chuàng)建一個“查找表”(或交叉引用表),但Prisma會處理這個問題,只需要與實(shí)體本身交互。

多對多特性的最后一步是允許通過標(biāo)簽找到想法,并在想法上找到標(biāo)簽。可以在清單9中看到模型的這一部分。(需要注意的是,為了簡潔起見,刪除了一些錯誤。)

清單9.通過想法找到標(biāo)簽,通過標(biāo)簽找到想法

// Display ideas with a given tag
app.get('/ideas/tag/:tagId', async (req, res) => {
 const { tagId } = req.params;
 try {
 const tag = await prisma.tag.findUnique({
 where: {
 id: parseInt(tagId)
 }
 });
 const ideas = await prisma.idea.findMany({
 where: {
 tags: {
 some: {
 id: tag.id
 }
 }
 }
 });
 res.json(ideas);
 } catch (error) {
 console.error('Error retrieving ideas with tag:', error);
 res.status(500).json({
 error: 'An error occurred while retrieving the ideas with the tag'
 });
 }
});
// tags on an idea:
app.get('/ideatags/:ideaId', async (req, res) => {
 const { ideaId } = req.params;
 try {
 const idea = await prisma.idea.findUnique({
 where: {
 id: parseInt(ideaId)
 }
 });
 const tags = await prisma.tag.findMany({
 where: {
 ideas: {
 some: {
 id: idea.id
 }
 }
 }
 });
 res.json(tags);
 } catch (error) {
 console.error('Error retrieving tags for idea:', error);
 res.status(500).json({
 error: 'An error occurred while retrieving the tags for the idea'
 });
 }
});

這里有兩個端點(diǎn):/ideas/tag/:tagId和/ideatags/:ideaId。它們的工作原理非常相似,可以為給定的標(biāo)簽ID找到想法。從本質(zhì)上來說,查詢就像一對多關(guān)系中的查詢一樣,Prisma處理查找表的遍歷。例如,為了找到一個想法的標(biāo)簽,可以使用tag.findMany 方法,其中有一個where子句查找具有相關(guān)ID的想法,如清單10所示。

清單10.測試標(biāo)簽概念的多對多關(guān)系

$ curl -X POST -H "Content-Type: application/json" -d '{"name":"Funny Stuff"}' http://localhost:3000/tags
$ curl -X POST http://localhost:3000/ideas/1/tags/2
{"idea":{"id":1,"name":"New Idea","description":"Idea description","ownerId":3},"tag":{"id":2,"name":"Funny Stuff"}}
$ curl localhost:3000/ideas/tag/2
[{"id":1,"name":"New Idea","description":"Idea description","ownerId":3}]
$ curl localhost:3000/ideatags/1
[{"id":1,"name":"New Tag"},{"id":2,"name":"Funny Stuff"}]

結(jié)論

雖然在這里涉及一些CRUD和關(guān)系基礎(chǔ)知識,但Prisma的能力遠(yuǎn)不止于此。它提供了級聯(lián)操作(如級聯(lián)刪除)、獲取策略(允許微調(diào)從數(shù)據(jù)庫返回對象的方式)、事務(wù)、查詢和篩選API等功能。Prisma還允許根據(jù)模型遷移數(shù)據(jù)庫模式。此外,它通過在框架中抽象所有數(shù)據(jù)庫客戶機(jī)工作,使應(yīng)用程序與數(shù)據(jù)庫無關(guān)。

Prisma以定義和維護(hù)模型定義為代價,為用戶提供了許多便利和功能。因此人們很容易理解這個用于JavaScript的ORM工具是開發(fā)人員一個熱門選擇的原因。

原文標(biāo)題:Prisma.js:Code-first ORM in JavaScript,作者:Matthew Tyson

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2021-09-02 15:24:25

Prisma JavaScript 類型安全

2021-01-14 21:37:01

JavaScript開發(fā)代碼

2020-06-12 08:21:58

JavaScript代碼開發(fā)

2022-03-07 16:30:10

數(shù)據(jù)庫ORM開發(fā)人員

2022-08-02 09:00:00

開發(fā)Web工具

2013-12-04 14:19:40

JavaScript代碼重用

2011-03-14 10:17:40

JavaScript

2022-06-30 08:03:13

Prisma數(shù)據(jù)庫工具開源

2023-06-20 19:39:40

JavaScriptHTML

2011-07-13 09:46:23

javaScript

2021-10-22 08:29:14

JavaScript事件循環(huán)

2017-12-19 15:24:21

DjangoPythonOracle

2014-01-21 10:09:39

JavaScript編譯Asm.js

2024-03-01 08:38:35

Hybrid頁面JS

2021-06-07 09:44:10

JavaScript開發(fā)代碼

2014-01-03 09:13:39

JavaScriptthis

2013-05-08 10:36:07

JavaScriptJS詳解JavaScrip

2021-04-06 10:45:18

React前端優(yōu)先級

2021-03-17 08:00:59

JS語言Javascript

2012-06-18 15:18:32

JS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

噜噜噜狠狠夜夜躁精品仙踪林| 91在线观看喷潮| 538任你躁精品视频网免费| 一区二区三区丝袜| 国产伦精品一区| 狠狠人妻久久久久久综合| 日韩中文在线电影| 精品剧情v国产在线观看在线| 日本免费不卡一区二区| 欧美性孕妇孕交| 日本欧美韩国一区三区| 久久99精品视频一区97| 波多野吉衣中文字幕| 日韩成人综合网| 五月婷婷激情综合| 性欧美.com| 三级小视频在线观看| 国产日韩一区| 久久视频在线看| 亚洲av片不卡无码久久| 99er精品视频| 色婷婷av一区| 精品一二三四五区| 91啦中文在线| 99re视频精品| 亚洲va欧美va在线观看| 无码人妻av免费一区二区三区| 一区二区三区四区在线观看国产日韩| 国产视频丨精品|在线观看| 亚洲第一区第二区第三区| 91精品国产高清91久久久久久| 日韩精选在线观看| 国产一区激情| 久久精品91久久久久久再现| 亚洲永久精品ww.7491进入| 国产一区 二区| 欧美性猛片aaaaaaa做受| 每日在线更新av| 欧美性受ⅹ╳╳╳黑人a性爽| 国产日产欧美一区二区视频| 国产一区二区三区奇米久涩| 精品乱子伦一区二区| 蜜臀av一区二区在线免费观看| 欧美亚洲一区在线| 日本三级中文字幕| 国内自拍视频一区二区三区| 久久精品亚洲热| 黄色片网站在线播放| 精品国产乱码久久久| 日韩激情av在线播放| 日韩精品人妻中文字幕有码| 91精品国产自产精品男人的天堂| 欧美一区二区视频网站| 天天操狠狠操夜夜操| 成人国产激情在线| 色综合久久综合| 少妇性饥渴无码a区免费| 嗯啊主人调教在线播放视频| 亚洲国产日韩在线一区模特 | 日韩avxxx| aa级大片免费在线观看| 香蕉加勒比综合久久| 无码专区aaaaaa免费视频| 新版中文在线官网| 一区二区三区在线视频免费| 日韩一级特黄毛片| 日本无删减在线| 亚洲国产视频一区二区| 国产3p露脸普通话对白| 国产高清自产拍av在线| 欧美三级免费观看| 日韩有码免费视频| 色8久久影院午夜场| 欧美无人高清视频在线观看| 青青草久久伊人| 国产精品亚洲四区在线观看| 欧美tk—视频vk| 国产十八熟妇av成人一区| 九九久久婷婷| 中文日韩在线视频| 三级av在线免费观看| 国产综合婷婷| 久久久视频精品| 特级毛片www| 精品影院一区二区久久久| 亚洲最大av网| 少妇人妻一区二区| 国产日本欧美一区二区| 亚洲欧美日韩国产成人综合一二三区| 精品孕妇一区二区三区| 亚洲尤物在线视频观看| 国模吧无码一区二区三区| 精品欧美日韩精品| 欧美一级免费观看| 99re久久精品国产| 欧美综合一区| 欧美激情综合色| 日韩毛片一区二区三区| 久久精品国产在热久久| 成人三级视频在线观看一区二区| 午夜福利视频一区二区| 国产精品欧美精品| 国产曰肥老太婆无遮挡| 美女写真久久影院| 日韩一卡二卡三卡| 男人天堂av电影| 91高清一区| 国产成人av在线播放| 国产青青草视频| 久久青草国产手机看片福利盒子| 午夜啪啪免费视频| 3344国产永久在线观看视频| 欧美日韩国产a| 熟妇高潮精品一区二区三区| 五月婷婷亚洲| 日本中文字幕成人| 亚洲精品视频91| 中文字幕一区二区三区不卡在线| 黄色一级片播放| 国产精品日韩精品在线播放| 国产一区二区av| 日本免费观看视| 国产麻豆精品视频| 日韩国产精品一区二区三区| 99久久精品免费看国产小宝寻花| av不卡一区| 韩国v欧美v亚洲v日本v| 国产一区二区三区四区五区加勒比| 97视频精彩视频在线观看| 亚洲综合网站在线观看| 超碰在线人人爱| 欧美freesex8一10精品| 欧美成人精品在线| 中文无码精品一区二区三区| 91在线小视频| 美女扒开大腿让男人桶| 久久国产精品美女| 日韩天堂在线视频| 成人免费毛片视频| 99久久婷婷国产综合精品| 国产911在线观看| 91麻豆精品国产综合久久久 | 福利精品视频在线| 第一页在线视频| 亚洲女同中文字幕| 成人福利视频在线观看| caoporn国产精品免费视频| 精品久久久精品| 动漫美女无遮挡免费| 欧美成人中文| 99re视频| 日本片在线观看| 日韩欧美一区中文| 九九在线观看视频| 国产精品羞羞答答xxdd| 欧美h视频在线观看| 亚洲伦理一区二区| 久久久国产一区二区| 国产欧美一级片| 亚洲精品高清视频在线观看| 久久人人爽人人片| 欧美日本一区| 好吊色欧美一区二区三区四区 | 日本黄色大片在线观看| 欧美精品91| 国产精品伊人日日| 国产精品蜜芽在线观看| 亚洲国模精品一区| 在线观看亚洲天堂| 久久久久国产精品人| 日韩人妻精品无码一区二区三区| 女人丝袜激情亚洲| 国产精品久久久久福利| avtt在线播放| 欧美一区二区三区小说| 久久久久亚洲av无码专区| 成人av电影在线网| 国产a视频免费观看| 日韩精品久久久久久久电影99爱| 91久久久久久久久| av资源新版天堂在线| 亚洲人成网站色ww在线| 中文字字幕在线观看| 夜夜精品视频一区二区| 中文字幕在线观看的网站| 日韩电影一二三区| 中文字幕一区二区三区四区五区人| 中文无码日韩欧| 欧美在线视频a| 免费在线视频欧美| 亚洲第一男人av| 波多野结衣不卡| 亚洲综合图片区| 亚欧洲乱码视频| 国产一区二三区好的| 国产精品又粗又长| 四虎国产精品免费观看| 国产精品国产精品| av成人亚洲| 午夜精品久久久久久久99黑人| 国产日韩精品在线看| 日韩欧美中文一区| 色老头在线视频| 有码一区二区三区| 国内精品卡一卡二卡三| 成人深夜福利app| 亚洲一区日韩精品| 夜夜嗨一区二区| 在线国产伦理一区| 电影一区中文字幕| 日韩中文在线中文网在线观看| 精品国产无码一区二区三区| 色综合一区二区| 91精品人妻一区二区三区| 懂色av中文一区二区三区| www日韩视频| 中文字幕一区二区精品区| 日本10禁啪啪无遮挡免费一区二区 | 国产无遮挡免费视频| 久久午夜色播影院免费高清| 波多野结衣三级视频| 久久三级视频| 妞干网视频在线观看| 久久不见久久见免费视频7| 3d动漫啪啪精品一区二区免费 | 又大又长粗又爽又黄少妇视频| 天使萌一区二区三区免费观看| 国产一区二区三区播放| 精品欧美久久| 久久爱av电影| av成人app永久免费| 国产成人综合亚洲| 久久不射影院| 久久九九国产精品怡红院| 久草在线青青草| 精品精品国产高清一毛片一天堂| 亚洲精品国产精品乱码视色| 午夜精品久久久久久久蜜桃app| 婷婷久久综合网| 欧美国产精品劲爆| 精品久久久久久中文字幕人妻最新| 国产一区日韩二区欧美三区| 少妇人妻互换不带套| 激情久久五月| 欧美做受777cos| 欧美成人有码| 免费观看黄色大片| 成人同人动漫免费观看| 国产一区在线免费| 精品三级在线观看视频| 91嫩草国产在线观看| 伊人久久大香线蕉综合影院首页| 日本中文字幕久久看| 亚洲v.com| 午夜精品三级视频福利| 丰满的护士2在线观看高清| 色综合久久88色综合天天看泰| 欧美人xxx| 日韩性生活视频| 日本免费中文字幕在线| 俺去了亚洲欧美日韩| av在线免费观看网站| 国产一区二区黄| 天堂аⅴ在线地址8| 中文字幕日韩在线视频| 国产精品四虎| 伊人久久久久久久久久| jyzzz在线观看视频| 伊人久久综合97精品| 精品久久av| 亚洲精品成人久久电影| 青青草视频在线免费观看| 日韩毛片在线看| 韩国福利在线| www.国产精品一二区| www.久久久久.com| 九九热这里只有在线精品视| 91九色国产在线播放| 午夜伦理精品一区| 国产高潮在线| 国产成人在线精品| 色8久久久久| 91亚洲永久免费精品| 77成人影视| 日本在线观看一区二区| 欧美成人精品一区二区三区在线看| 中文字幕剧情在线观看一区| 久久伦理在线| 999在线观看视频| 久久中文在线| 国产乱码一区二区三区四区| 不卡一二三区首页| 成人午夜剧场视频网站| 国产精品美日韩| 国产无套粉嫩白浆内谢| 色老综合老女人久久久| 国产精品一区二区av白丝下载| 91精品久久久久久久久99蜜臂| 五月天婷婷视频| 中国日韩欧美久久久久久久久| 97超碰资源站在线观看| 日韩免费高清在线观看| 国产日本亚洲| 久久艳妇乳肉豪妇荡乳av| 91日韩在线| 国产精彩视频一区二区| 日韩不卡免费视频| 精品国产乱码久久久久夜深人妻| 久久久亚洲欧洲日产国码αv| 911国产在线| 一区二区三区在线播| 艳妇乳肉豪妇荡乳av无码福利| 日韩欧美激情一区| 国产在线中文字幕| 午夜精品福利在线观看| 欧美美女被草| 久久久久久久久四区三区| 午夜国产精品视频免费体验区| 日韩精品―中文字幕| 国产曰批免费观看久久久| 亚洲码无人客一区二区三区| 一区二区三区在线不卡| 中文字幕a级片| 亚洲女人天堂av| 欧美videos另类精品| 国产精自产拍久久久久久| 精品欧美午夜寂寞影院| 美国av在线播放| 免费在线观看成人av| 人妻激情偷乱频一区二区三区| 中文字幕人成不卡一区| www.com亚洲| 亚洲毛茸茸少妇高潮呻吟| 欧美人与牲禽动交com| 国产精品一区二区久久久| 亚洲免费福利一区| 欧美国产视频一区| 久久99精品久久久久久久久久久久 | 日本三级2019| 精品国产伦一区二区三区免费 | 天天躁日日躁狠狠躁欧美| 色哺乳xxxxhd奶水米仓惠香| 日韩精品乱码免费| 日本xxxxxxxxx18| 精品久久久久久久中文字幕| 精品人妻少妇AV无码专区 | av日韩中文字幕| 久久精品青草| 在线免费观看av网| 日本一区二区成人| 中文字幕国产在线观看| 亚洲精品一区中文| 麻豆免费版在线观看| 国产伦精品一区二区三区四区视频| 狠狠噜噜久久| 国产成人精品一区二区三区在线观看 | 国产精品久久久久久久久妇女| 国产日韩成人内射视频 | 亚洲a在线播放| 亚洲精品91| 色婷婷一区二区三区在线观看| 一区二区中文视频| 一区二区三区亚洲视频| 日韩在线视频播放| 亚洲伦理影院| 午夜免费电影一区在线观看| 日本在线不卡视频一二三区| 精品视频第一页| 欧美卡1卡2卡| 最爽无遮挡行房视频在线| 成人av电影免费| 欧美特黄一区| 老司机免费视频| 日本韩国一区二区| 香蕉视频网站在线观看| 成人两性免费视频| 狠狠色综合网| 欧美xxxxx精品| 亚洲午夜电影网| 九色在线播放| 成人a在线视频| 狠狠久久婷婷| 亚洲成人网在线播放| 欧美性生活一区| 丝袜在线观看| 精品福利影视| 免费在线看成人av| 欧美日韩一级在线观看| 亚洲成人精品视频在线观看| 国产高清在线a视频大全| 欧美亚洲爱爱另类综合| 日本欧美一区二区三区乱码| 久久久久久久福利| 亚洲精品一区二区久| 亚洲精品777| 国产美女无遮挡网站| 国产精品区一区二区三区| 99久久夜色精品国产亚洲| 欧美一级免费视频| 91亚洲国产|