[컴][nodejs] objection.js 사용하기

orm nodejs orm / orm 추천 /laravel / query builder


objection.js 사용하기

typescript example


사용

기본적으로 모든 query 는 특정 Model 로 부터 시작한다.(참고)

insert: objection.js/api.ts at master · Vincit/objection.js · GitHub

update: objection.js / update.ts example

typescript 에서 model 작성: objection.js github /tests/ts/fixtures/person.ts 

validation

  • jsonSchema 가 있으면 update/insert 시 자동적으로 호출됨.
  • required(required: [],) 는 그래서 update 때도 필수적으로 필요한 부분을 적어야 한다. 안그러면 update 시점에도 required 부분이 적용된다.
  • objection.js/validation.md
  • objection.js/Animal.ts: ts version jsonSchema 예제 확인 가능  

modifier

query builder 의 확장 : 이것의 위의 modifier 와 비슷하다.

raw query : Raw queries > Examples

transaction :

upsert with knex

vs bookshelf.js

examples

// Mocha Test 코드
var assert = require('assert');
var { Tag } = require('../../../../src/js/app/model/tag')
var { insertOrUpdate } = require('../../../../src/js/lib/db')
var { Model, transaction, DBError } = require('objection')
var Knex = require('knex')
var { knexConfig } = require('../../../../src/js/knexconfig')

// Initialize knex.
const knex = Knex({
  client: 'sqlite3',
  useNullAsDefault: true,
  connection: {
    filename: ':memory:',
  },
  pool: {
    afterCreate: (conn, cb) => {
      conn.run('PRAGMA foreign_keys = ON', cb);
    }
  }
});

// Bind all Models to a knex instance. If you only have one database in
// your server this is all you have to do. For multi database systems, see
// the Model.bindKnex() method.
Model.knex(knex);

const createTableTag = async function createTableTag(knex) {
  const has = await knex.schema.hasTable('tag')
  if (!has) {
    const res = await knex.schema.createTable('tag', function (table) {
      table.increments(); // integer id
      table.timestamps();
      // name
      table.string('name');
    });
    return res;
  }

};

describe('Connection', () => {


  it('it should FIND a tag-name or INSERT', async () => {
    // Tag.knex() 대신에 knex 를 사용하면, 현재 존재하는 db 의 table 을 이용하게 된다.
    const res2 = await createTableTag(Tag.knex());
    await insertOrUpdate(Tag.knex(), Tag.tableName, { name: 'test111' });

  });

});

migration

init 을 하면 knexfile.js 가 만들어진다. migrate:make <name> 을 하면 <name> 을 갖는 migration template을 하나 만들어준다. 그럼 이 template 안에 db migration 관련 내용을 적으면 된다.

.\node_modules\.bin\knex.cmd init
.\node_modules\.bin\knex.cmd migrate:make my_table_name
// migration file
exports.up = function(knex) {
  return knex.schema
    .createTable('logs', (table) => {
      table.increments('id').primary()

      // table
      //   .integer('type').unsigned()
      //   .references('id').inTable('persons')
      //   .onDelete('SET NULL')
      //   .index()

      table.integer('type')
      table.json('log')
    }) 
};

exports.down = function(knex) {
  return knex.schema
    .dropTableIfExists('logs') 
};  

migration file 을 다 만든 후 migrate:latest 를 실행하면 된다.

production 인 경우, windows 기준으로 아래처럼 실행하면 된다. 이때 현재 실행하는 directory 위치에서 knexfiles.jsmigrations/*.js 파일을 가져다 migration 을 실행한다.

참고로, npm run script 로 넣어서 실행하는 경우 directory 가 안맞아서 안된다. (option 으로 path 를 변경해도 안됐다.)

set NODE_ENV=production
cd <proj_root>
.\node_modules\.bin\knex.cmd migrate:latest

References

  1. Objection.js

 

 

댓글 없음:

댓글 쓰기