Node knex Schema Knex - Schema Builder Knex는 데이터를 읽어오고 조작하는 쿼리(DML, Data Manipulation Language) 뿐만 아니라 테이블을 생성하고 조작하는 쿼리(DDL, Data Definition Language)도 지원합니다.
knex.schema
로 반환되는 객체를 이용해 테이블을 만들고, 수정하고, 삭제하는 등의 작업을 할 수 있습니다. 여기서 schema는 getter function으로, 반환된 객체는 재사용이 불가능하다는 점에 주의하세요.
CREATE TABLE 다양한 타입의 컬럼을 만들 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 knex.schema.createTable('table_name' , function (table ) { table.integer('column_name' ) table.text('column_name' ) table.string('column_name' , 255 ) table.float('column_name' , 8 , 2 ) table.decimal('column_name' , 8 , 2 ) table.boolean('column_name' ) table.datetime('column_name' ) table.timestamp('column_name' ) table.enum('column_name' , ['M' , 'F' ]) })
아래와 같이 제약 조건을 걸 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 knex.schema.createTable('table_name' , function (table ) { table.increments(); table.integer('col1' ).primary() table.primary(['col1' , 'col2' ]) table.integer('col2' ).unssigned() table.integer('col3' ).defaultTo(0 ) table.timestamp('creatd_at' ).defaultTo(knex.fn.now()) table.integer('col4' ).notNullable() table.foreign('other_table_id' ).references('other_table.id' ) table.foreign('other_table_id' ).references('other_table.id' ).onDelete('RESTRICT' ) table.unique('col1' ) table.unique(['col1' , 'col2' ]) })
ALTER TABLE 이미 만들어진 테이블을 수정할 수도 있습니다.
1 2 3 4 5 6 7 8 9 10 11 knex.schema.alterTable('table_name' , function (table ) { table.renameColumn('old_column_name' , 'new_column_name' ) table.integer('new_int_column' ) table.integer('old_int_column' ).notNullable().alter() })
Knex는 이 외에도 많은 DDL 관련 기능을 지원합니다. 자세한 사용법은 공식 문서 를 참고해주세요.
실습 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 const knex = require ('./knex' )knex.schema.createTable('user' , t => { t.string('id' ).primary() t.string('password' ).notNullable() }).then(() => knex.schema.createTable('url_entry' , t => { t.string('id' , 8 ).primary() t.string('long_url' ).notNullable() t.string('user_id' ) t.foreign('user_id' ).references('user.id' ) t.timestamp('created_at' ).defaultTo(knex.fn.now()) })).then(process.exit)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 require ('dotenv' ).config()module .exports = require ('knex' )({ client: 'mysql' , connection: { host: 'localhost' , user: 'root' , password: '****' , database: 'url_shortner' }, debug: true })
database의 이름을 맞춰야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 const knex = require ('./knex' )knex.schema.createTable('user' , t => { t.string('id' ).primary() t.string('password' ).notNullable() }).then(() => knex.schema.createTable('url_entry' , t => { t.string('id' , 8 ).primary() t.string('long_url' ).notNullable() t.string('user_id' ) t.foreign('user_id' ).references('user.id' ) t.timestamp('created_at' ).defaultTo(knex.fn.now()) })).then(process.exit)
local환경이라면 session의 name은 각각 다르게 해줘야한다.