7. MySQL
7. MySQL
7.1 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋?
๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ๋ฐ ์กฐ์ ํ ์ ์๋ ์์คํ -> DBMS
RDBMS : MySQL
NoSQL : MongoDB
7.2 MySQL ์ค์นํ๊ธฐ
๋์ปค๋ก ๋์ฒด
# ๋์ปค์ค์น
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
# docker image ์์ฑ ๋ฐ ์คํ
$ docker run -it -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --name mysql5.7 mysql:5.7
7.3 DB SQL ์ค์น
์ํฌ๋ฒค์น ๋์ Datagrip์ด๋ DBeaver(๋ฌด๋ฃ) ์ถ์ฒ ์ํฌ๋ฒค์น ์๋ต
Datagrip : https://www.jetbrains.com/datagrip/
DBeaver : https://dbeaver.io/
7.4 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ํ
์ด๋ธ ์์ฑํ๊ธฐ
-- Database ์์ฑ
CREATE DATABASE nodejs;
-- Database ์ฌ์ฉ
use nodejs;
-- ํ
์ด๋ธ ์ค๋ช
DESC users;
DROP TABLE ํ
์ด๋ธ๋ช
;
...
์๋ฃํ
INT : ์ ์์๋ฏธ. ์์๊น์ง ์ ์ฅ -> FLOAT, DOUBLE ์ฌ์ฉ
VARCHAR : ๊ฐ๋ณ๊ธธ์ด. ๋ช๋ฐฑ์ ์ด๋ด
TINYINT : -127 ~ 128
TEXT : ๊ธด๊ธ ์ ์ฅ
DATETIME : ๋ ์ง ๋ฐ ์๊ฐ์๋ ํ ์ ๋ณด. ๋ ์ง๋ง -> DATE, ์๊ฐ -> TIME
7.5 CRUD ์์
ํ๊ธฐ (์์ฑ, ์ฝ๊ธฐ, ์์ , ์ญ์ )
C : Create. ์์ฑ
insert into table values (๊ฐ,...)
R : Read. ์ฝ๊ธฐ
select * from table
U : Update. ์์
update table set field1 = x, field2 = y ..
D : Delete. ์ญ์
delete from table where ~
7.6 ์ํ๋ผ์ด์ฆ ์ฌ์ฉํ๊ธฐ
ORM : ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฆด๋ ์ด์ ๋งคํ
์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ -> SQL๋ก ๋ฐ๊ฟ์ค
๋ชจ๋ ์ค์น
# project ์์ฑ $ express learn-sequelize --view=pug # sequelize์ mysql2 ํจํค์ง ์ค์น, cli ์ ์ญ์ค์น $ npm i sequelize mysql2 $ npm i -g sequelize-cli $ sequelize init
config.json ๋ด์ฉ
operatorsAliases : ๋ณด์์ ์ทจ์ฝํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถ (false์ ๋ ฅ : ์ฌ์ฉ์ํจ)
4๋ ์ ๋ณด : username, password, database, host ์ ๋ณด ์๋ง๊ฒ ์ ๋ ฅ
{ "development": { "username": "root", "password": null, "database": "database_development", "host": "127.0.0.1", "dialect": "mysql", "operatorsAliases": false }, "test": { "username": "root", "password": null, "database": "database_test", "host": "127.0.0.1", "dialect": "mysql", "operatorsAliases": false }, "production": { "username": "root", "password": null, "database": "database_production", "host": "127.0.0.1", "dialect": "mysql", "operatorsAliases": false } }
var sequelize = require('./models/index').sequelize;
var app = express();
sequelize.sync(); // ๋ฉ์๋ ์๋๋ฐ;;?
models/user.js
user ์ ๋ณด
sequlize.define ๋ฉ์๋๋ก ๋ชจ๋ธ ์ ์. ์ํ๋ผ์ด์ฆ์ MySQL ์๋ฃํ์ ์ฝ๊ฐ ์์ด
MySQL
์ํ๋ผ์ด์ฆ
VARCHAR
STRING
INT
INTEGER
TINYINT
BOOLEAN
DATETIME
DATE
ํ ์ด๋ธ๋ช ๋ณต์ํ
๋ชจ๋ธ๋ช ๋จ์ํ
// define(๋ชจ๋ธ๋ช
, ์คํค๋ง์ ์, ํ
์ด๋ธ์ต์
)
// user.js
module.exports = (sequelize, DataTypes) => {
return sequelize.define('user', {
name: {
type: DataTypes.STRING(20),
allowNull: false, // -> not null ์ต์
๊ณผ ๋์ผ
unique: true // -> unique ์ต์
๊ณผ ๋์ผ
},
age : {
type: DataTypes.INTEGER.UNSIGNED,
allowNull : false
},
married:{
type: DataTypes.BOOLEAN,
allowNull: true
},
comment :{
type: DataTypes.TEXT,
allowNull:false
},
created_at :{
type: DataTypes.DATE,
allowNull : false,
defaultValue: sequelize.literal('now()') // -> default ์ต์
๊ณผ ๋์ผ
},
}, {
timestamps: false // true : createdAt, updatedAt ์ปฌ๋ผ ์๋ ์ถ๊ฐ ๋ฐ ์๋ ์
๋ฐ์ดํธ
});
};
// comment.js
module.exports = (sequlize, DataTypes) => {
return sequlize.define('comment', {
comment: {
type: DataTypes.STRING(100),
allowNull: false
},
created_at: {
type: DataTypes.DATE,
allowNull: true,
defaultValue: sequlize.literal('now()')
}
}, {
timestamps: false
});
};
// index.js
// db ๊ฐ์ฒด์ property์ js์ ๊ฐ์ฒด ์ ๋ณด ์ฐ๊ฒฐ
db.User = require('./user')(sequelize, Sequelize);
db.Comment = require('./comment')(sequelize, Sequelize);
์ ์ธ์ ํ ์ด๋ธ์ต์
paranoid : timestamps๊ฐ true์ธ ๊ฒฝ์ฐ๋ง ์ฌ์ฉ ๊ฐ๋ฅ, deletedAt ์ปฌ๋ผ์ด ์ถ๊ฐ๋จ. ์ญ์ ์ ์ญ์ ๋ ๋ ์ง๊ฐ ์ ๋ ฅ๋จ (์ญ์ ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋จ๊ฒจ๋๋ ์ด์ ๋ ๋ฐฑ์ ๋ฐ ํ์คํ ๋ฆฌ ๊ด๋ฆฌ ๋๋ฌธ)
underscored : createdAt, updatedAt, deleteAt ์ปฌ๋ผ๊ณผ ์ํ๋ผ์ด์ฆ๊ฐ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ๊ด๊ณ ์ปฌ๋ผ๋ค์ ์ด๋ฆ์ ์ค๋ค์ดํฌ์ผ์ด์ค ํ์์ผ๋ก ๋ณ๊ฒฝ ํด์ค. ์ค๋ค์ดํฌ์ผ์ด์ค๋ ๋๋ฌธ์ ๋์ _๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์. ex : createdAt -> created_at
tableName : ํ ์ด๋ธ ์ด๋ฆ์ ๋ค๋ฅธ๊ฒ์ผ๋ก ์ค์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ. ์ํ๋ผ์ด์ฆ๋ ์๋์ผ๋ก ์ฒซ๋ฒ์งธ ์ธ์(๋ชจ๋ธ๊ฐ)๊ฐ์ ๋ณต์ํ์ผ๋ก ๋ง๋ค์ด ํ ์ด๋ธ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํจ. user -> users, comment -> comments
1:N ๊ด๊ณ ํํ hasMany๋ฉ์๋ ์ฌ์ฉ. foreignKey ์์ฑ์ผ๋ก ๊ฐ ์ผ์น. sourceKey ํค๊ฐ(id), targetKey ํค๊ฐ(id)
// user๋ comment๋ฅผ ๋ง์ด ๊ฐ์ ์ ์๋ค db.User.hasMany(db.Comment, {foreignKey: 'commenter', sourceKey: 'id'}); // commnet๋ user์ ์ํ ์ ์๋ค db.Comment.belongsTo(db.User, {foreignKey: 'commenter', targetKey: 'id'});
1:1 ๊ด๊ณ ํํ hasOne ๋ฉ์๋ ์ฌ์ฉ. foreignKey ์์ฑ์ผ๋ก ๊ฐ ์ผ์น. sourceKey ํค๊ฐ(id), targetKey ํค๊ฐ(id)
// user๋ info๋ฅผ ํ๋ ๊ฐ๊ณ ์๋ค. db.User.hasOne(db.Info, {foreignKey: 'user_id', sourceKey: 'id'}); // info๋ user์ ์ํ ์ ์๋ค. db.Info.belongsTo(db.User, {foreignKey: 'user_id', targetKey: 'id'});
N:M ๊ด๊ณ ํํ (๋ค๋๋ค) belongsToMany ๋ฉ์๋ ์ฌ์ฉ. through ์์ฑ์ ์ค๊ฐ ๊ด๊ณ ํ ์ด๋ธ ์ด๋ฆ ์ด๋ผ๊ณ ๋ณด๋ฉด๋ ๋ฏ.
// post(๊ฒ์๊ธ)์ ์ฌ๋ฌ๊ฐ์ ํด์ํ๊ทธ๋ฅผ ๊ฐ์ ์ ์๋ค. db.Post.belongsToMany(db.Hashtag, {through: 'PostHashtag'}); // hashtag(ํด์ํ๊ทธ)๋ ์ฌ๋ฌ๊ฐ์ ๊ฒ์๊ธ์ ๋ฌ๋ฆด ์ ์๋ค. db.Hashtag.belongsToMany(db.Post, {through: 'PostHashtag'});
get+๋ชจ๋ธ์ด๋ฆ ๋ณต์ํ
async (req, res, next) => { const tag = await Hashtag.find({where:{title:'node'}}); const posts = await tag.getPosts(); }
์ํ๋ผ์ด์ฆ ์ฟผ๋ฆฌ ์์๋ณด๊ธฐ
์ํ๋ผ์ด์ฆ๋ง์ ๋ฐฉ์ ๋ฐํ : ํ๋ก๋ฏธ์ค async/await ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅ
order : ์ ๋ ฌ๋ฐฉ์
attributes : select ์ปฌ๋ผ ๋ช ์
์ํ๋ผ์ด์ฆ์ OP -> ์คํผ๋ ์ดํฐ
// INSERT INTO users (name, age, married, comment) VALUES('zero', 24, 0, '์๊ธฐ์๊ฐ1');
const {User} = require('../models')
User.create({
name: 'zero',
age: 24,
married: false,
comment: '์๊ธฐ์๊ฐ1'
});
// select * from users;
User.findAll({});
// select * from users limit 1;
Uesr.find({});
// select name, married from users;
User.findAll({
attributes:['name', 'married']
});
// select name, age from users where married = 1 and age > 30
const {User, Sequelize :{Op}} = require('../models');
User.findAll({
attributes:['name', 'age'],
where: {
married:1,
age: {[Op.gt]:30}
}
})
// select id, name from users order by age desc;
User.findAll({
attributes:['id', 'name'],
order: [[]]
})
// select id, name from users where married = 0 OR age >30;
const {User, Sequelize: {Op}} = require('../models');
User.findAll({
attributes: ['id', 'name'],
where: {
[Op.or]: [{married: 0}, {age: {[Op.gt]:30}}]
}
})
// select id, name from users order by age desc;
User.findAll({
attributes: ['id', 'name'],
order: [['age', 'DESC']]
})
// select id, name, from users order by age desc limit 1 offset 1;
User.findAll({
attributes: ['id', 'name'],
order: ['age', 'DESC'],
limit: 1,
offset: 1
})
// update users set comment = '๋ด์ฉ' where id = 2;
User.update({
comment: '๋ด์ฉ' // ์์ ๋ด์ฉ
},{
where: {id: 2} // ์์ ๋์ ๋ก์ฐ ์ฐพ๊ธฐ
})
// delete from users where id = 2
User.destroy({
where:{id: 2}
})
Last updated
Was this helpful?