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
- modifier 는 Model 내에 자주 사용하는 query 의 일부를 함수로 만들어 사용하는 것. 자세한 것은 예제를 확인하자.
- Modifiers | Objection.js
- modifiers.html#usage-in-a-query
query builder 의 확장 : 이것의 위의 modifier 와 비슷하다.
raw query : Raw queries > Examples
transaction :
upsert with knex
vs bookshelf.js
- Bookshelf.js vs Objection.js | What are the differences?
- 기본적으로 await/sync 를 사용하기에는 objection.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
- objection.js/examples/koa-ts/models at master · Vincit/objection.js · GitHub : knex migration 관련 file 들의 예를 확인할 수 있다.
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.js
와 migrations/*.js
파일을 가져다 migration 을 실행한다.
참고로, npm run script 로 넣어서 실행하는 경우 directory 가 안맞아서 안된다. (option 으로 path 를 변경해도 안됐다.)
set NODE_ENV=production
cd <proj_root>
.\node_modules\.bin\knex.cmd migrate:latest
References
댓글 없음:
댓글 쓰기