Mysql笔记-语法基础与在node项目中使用Esquelize

目录

Mysql

安装

sql语句基础

外键

Esquelize

安装

测试连接

创建模型(表)

数据同步(sync)

插入数据

查询数据

更新数据

删除数据

连接池


Mysql

安装

网上教程非常多不赘述。

 

sql语句基础

show DATABASES;-- 查询所有数据库

CREATE DATABASE blog_learn; -- 创建数据库

-- 使用数据库

USE blog_learn;

-- 查询表

SELECT * FROM users;

SELECT * FROM blogs;

-- 查询表中项

SELECT username, nickname FROM users;

-- 数据条件查找表中项

SELECT username,nickname from users WHERE username='wuwuwu'AND `password`=654321;

-- 降序查询表中项

SELECT * FROM blogs ORDER BY id DESC;

-- 查询数据总数

SELECT COUNT(id) AS 'count' FROM blogs;

-- 降序,限制2行数,跳过2行查询数据

SELECT * FROM blogs ORDER BY id DESC LIMIT 2 OFFSET 2;

-- 连表查询(最好有外键的前提下,两表之间一起查询)不一定要有外键

SELECT * FROM blogs INNER JOIN users ON users.id=blogs.userid;

SELECT blogs.*,users.username,users.nickname

FROM blogs INNER JOIN users ON users.id=blogs.userid WHERE users.nickname='走走走';

-- 创建表

CREATE TABLE `blog_learn`.`无标题`  (

  `id` int(0) NOT NULL AUTO_INCREMENT,

  `title` varchar(255) NOT NULL,

  `content` text NOT NULL,

  `userid` int(0) NOT NULL COMMENT '对应users表',

  PRIMARY KEY (`id`)

);

-- 增加数据

INSERT INTO users(username,`password`,nickname)VALUES('zouzouzou',123456,'走走走');

INSERT INTO blogs(title,content,userid)VALUES('标题2','内容',2);

-- 更新数据

UPDATE blogs SET content='内容1内容1' WHERE id=1;

-- 删除数据

DELETE FROM blogs WHERE id=4;

外键

外键的作用是保持数据一致性、完整性,主要体现在下面两个方面:

阻止执行

从表插入新行,其外键值不是主表的主键值便阻止插入;

从表修改外键值,新值不是主表的主键值便阻止修改;

主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);

主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。

级联执行

主表删除行,连带从表的相关行一起删除;

主表修改主键值,连带从表相关行的外键值一起修改。

添加userid(blog)->id(users)外键实例代码:

ALTER TABLE `blog_learn`.`blogs`

ADD CONSTRAINT `usersid` FOREIGN KEY (`userid`) REFERENCES `blog_learn`.`users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

 

Esquelize

安装

  1. 在项目根目录下若无配置文件,先安装:npm init -y
  2. 安装mysql2、sequelize的包:npm i mysql2 sequelize -d

测试连接

1.创建seq.js

const Sequlize = require('sequelize')//引入包

//创建连接

const conf = {

host: 'localhost',

dialect:'mysql'

}

const seq = new Sequlize('blog_learn','root','zjl199761',conf)//数据库名,权限,密码

//测试连接,终端执行node src/seq.js测试

seq.authenticate().then(() => {

console.log('ok')

}).catch(() => {

console.log('err')

})

// module.exports = seq//输出实例

  1. 终端执行:node src/seq.js测试

创建模型(表)

  1. 新建model.js,例新建User模型表

const Sequelize = require('sequelize')

const seq = require('./seq')//导入创建连接的包

 

//创建User模型,数据表的名字是users

const User = seq.define('user',{

//id会自动创建,并设为主键

userName: {

type: Sequelize.STRING,//varvhar:255

allowNull:false

},

password: {

type:Sequelize.STRING,

allowNull:false

},

nickName:{

type: Sequelize.STRING,

comment:'昵称'//注释

}

//自动创建:createAt和updatedAt

})

module.exports ={

User

}

  1. 外键关联

//外键关联

//两者区别在于谁在前面,通过谁去查谁

Blog.belongsTo(User,{

//创建外键 Blog.userId -> User.Id

foreignKey:'useId'

})

User.hasMany(Blog,{

//创建外键 Blog.userId -> User.Id

foreignKey:'useId'

})

数据同步(sync)

  1. 在sync.js下

const seq = require('./seq')

require('./model')

//测试连接

seq.authenticate().then(() => {

console.log('auto ok')

}).catch(() => {

console.log('auto err')

})

//执行同步

//force:若数据库中有也强行创建

seq.sync({ force: true }).then(() =>{

console.log("sync ok")

process.exit()//退出

})

2.终端执行:node src/sync.js;在mysql中同步数据

插入数据

  1. 在create.js中(create方法,dataValues方法)

const {Blog, User} = require('./model')

//!()()上面程序中断不影响里面代码执行

!(async function () {

//创建用户行

const zouzouzou = await User.create({

userName:'zouzouzou',

password:'123456',

nickName:'走走走'

})

console.log('zouzouzou',zouzouzou.dataValues)

const zouzouzouId = zouzouzou.dataValues.id

const blog22 = await Blog.create({

title:'标题22',

content:'内容22',

userId:zouzouzouId

})

})()

查询数据

const {Blog, User} = require('./model')

 

!(async function () {

//查询一条记录FindOne

const zouzouzou = await User.findOne({

where:{

userName:'zouzouzou'

}

})

console.log('zouzouzou',zouzouzou.dataValues)

//查询特定的列,添加属性attributes如:['userName','nickName'],

const zouName = await User.findOne({

attributes:['userName','nickName'],

where:{

userName:'zouzouzou'

}

})

console.log('zouName',zouName.dataValues)

//查询一个列表findAll

const zouBlogList = await Blog.findAll({

where:{

userId:1

},

order:[

['id','desc']

]

})

console.log(

'zouList',//map处理数据,回调函数返回其中的值

zouBlogList.map(blog => blog.dataValues)

)

//分页查询:限制查询

const blogPageList = await Blog.findAll({

limit:2,//限制查询两行

offset:0,//跳过多少条

order:[

['id','desc']//降序

]

})

console.log(

'blogPageList',

blogPageList.map(blog=>blog.dataValues)

)

//查询总数findAndCountAll

const blogListAndCount = await Blog.findAndCountAll({

limit:2,//限制查询两行

offset:0,//跳过多少条

order:[

['id','desc']//降序

]

})

console.log(

'blogListAndCount',

blogListAndCount.count,//所有总数。不考虑分页

blogListAndCount.rows.map(blog=>blog.dataValues)//.row返回数组

)

//连表查询依赖Blog.belongsTo(User

const blogListWithUser = await Blog.findAndCountAll({

order:[

['id','desc']

],

include:[//包含

{

model:User,//在User表中查

attributes:['userName','nickName'],

where:{

userName:'zouzouzou'

}

}

]

})

console.log(

'blogListWithUser',

blogListWithUser.count,

blogListWithUser.rows.map(

blog =>{

const blogVal = blog.dataValues

blogVal.user = blogVal.user.dataValues//1对多关系所有用user

return blogVal

}

)

)

//连表查询依赖User.hasMany(Blog,{

const UserListWithBlog = await User.findAndCountAll({

attributes:['userName','nickName'],

include:[

{

model:Blog

}

]

})

console.log(

'userListWithBlog',

UserListWithBlog.count,

//JSON.stringify强制转化JSON

JSON.stringify(UserListWithBlog.rows.map(user=>{

const userVal = user.dataValues

userVal.blogs=userVal.blogs.map(blog=>blog.dataValues)//1对多关系所有用blogs

return userVal

}))

)

})()

更新数据

Update.js

const { User} = require('./model')

//更新zouzouzou的昵称nickname

!(async function () {

const updateRes = await User.update({//两个参数

nickName:'走走走1'

},{

where:{

userName:'zouzouzou'

}

})

console.log('Update',updateRes[0]>0)

})()

删除数据

const { User,Blog} = require('./model')

 

!(async function () {

//删除一条博客

const delBlogRes = await Blog.destroy({

where:{

id:4

}

})

console.log('delBlogRes',delBlogRes>0)

//删除一个用户,若有外键在mysql中外键设计要Do Delete:cascade

const delUserRes = await User.destroy({

where:{

id:1

}

})

console.log('delUserRes',delUserRes>0)

})()

连接池

在seq.js中

//线上环境,使用连接池

conf.pool = {

max:5,//连接池中最大的连接数量

min:0,//最小

idle:10000//如果一个连接池10S之内没有被使用,则释放

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值