멋진 커뮤니티 모듈

fibj에 대한 객체 관계형 매핑

빌드 상태

설치

1
npm install fib-orm

테스트

1
npm run ci

DBMS 지원

  • MySQL 및 MariaDB
  • SQLite

특징

fib-orm은 node-orm 객체에 일련의 동기 버전 메소드를 추가합니다.

소개

이것은 fibjs 객체 관계형 매핑 모듈입니다.

예를 들면 :

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 35 36 37
var orm = require("fib-orm"); var db = orm.connectSync("mysql://username:password@host/database"); var Person = db.define("person", { name : String, surname : String, age : Number, // FLOAT male : Boolean, continent : [ "Europe", "America", "Asia", "Africa", "Australia", "Antartica" ], // ENUM type photo : Buffer, // BLOB/BINARY data : Object // JSON encoded }, { methods: { fullName: function () { return this.name + ' ' + this.surname; } }, validations: { age: orm.enforce.ranges.number(18, undefined, "under-age") } }); // add the table to the database db.syncSync(); // add a row to the person table Person.createSync({ id: 1, name: "John", surname: "Doe", age: 27 }); // query the person table by surname var people = Person.findSync({ surname: "Doe" }); // SQL: "SELECT * FROM person WHERE surname = 'Doe'" console.log("People found: %d", people.length); console.log("First person: %s, age %d", people[0].fullName(), people[0].age); people[0].age = 16; people[0].saveSync();

node.js 버전은 다음과 같습니다.

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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
var orm = require("orm"); orm.connect("mysql://username:password@host/database", function (err, db) { if (err) throw err; var Person = db.define("person", { name : String, surname : String, age : Number, // FLOAT male : Boolean, continent : [ "Europe", "America", "Asia", "Africa", "Australia", "Antartica" ], // ENUM type photo : Buffer, // BLOB/BINARY data : Object // JSON encoded }, { methods: { fullName: function () { return this.name + ' ' + this.surname; } }, validations: { age: orm.enforce.ranges.number(18, undefined, "under-age") } }); // add the table to the database db.sync(function(err) { if (err) throw err; // add a row to the person table Person.create({ id: 1, name: "John", surname: "Doe", age: 27 }, function(err) { if (err) throw err; // query the person table by surname Person.find({ surname: "Doe" }, function (err, people) { // SQL: "SELECT * FROM person WHERE surname = 'Doe'" if (err) throw err; console.log("People found: %d", people.length); console.log("First person: %s, age %d", people[0].fullName(), people[0].age); people[0].age = 16; people[0].save(function (err) { // err.msg = "under-age"; }); }); }); }); });

문서

하지 노드-ORM을 참조 할 수 있습니다 문서의 개발에 추가 새로운 새로운 기능 Fibjs을, DID, 전용 버전.에 대한 동기 비동기 호출로 변경해야 위키 .

설정

위키 에서 정보를 참조하십시오.

연결 중

위키 에서 정보를 참조하십시오.

모형

모델은 하나 이상의 데이터베이스 테이블에 대한 추상화이며 모델은 연결을 지원합니다 (아래 참조). 모델 이름은 테이블 이름과 일치하는 것으로 가정합니다.

모델은 테이블 데이터에 액세스하고 조작하기위한 동작을 지원합니다.

모델 정의

위키 에서 정보를 참조하십시오.

Properties

위키 에서 정보를 참조하십시오.

Instance Methods

모델 정의 중에 전달됩니다.

1 2 3 4 5 6 7 8 9 10 11 12 13
var Person = db.define('person', { name : String, surname : String }, { methods: { fullName: function () { return this.name + ' ' + this.surname; } } }); var person = Person.getSync(4); console.log( person.fullName() );

Model Methods

모델에서 직접 정의됩니다.

1 2 3 4 5 6 7 8 9
var Person = db.define('person', { name : String, height : { type: 'integer' } }); Person.tallerThan = function(height) { return this.findSync({ height: orm.gt(height) }); }; var tallPeople = Person.tallerThan( 192);

모델로드 [지원하지 않음]

모델은 별도의 모듈에있을 수 있습니다. 모델을 보유한 모듈이 module.exports를 사용하여 데이터베이스 연결을 허용하는 함수를 게시 한 다음 원하는대로 모델을로드하면됩니다.

이 기술을 사용하면 계단식 하중을 가질 수 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// your main file (after connecting) db.loadSync("./models"); // loaded! var Person = db.models.person; var Pet = db.models.pet; // models.js module.exports = function (db) { db.loadSync("./models-extra"); db.define('person', { name : String }); }; // models-extra.js module.exports = function (db) { db.define('pet', { name : String }); };

모델 동기화

위키 에서 정보를 참조하십시오.

모델 삭제

위키 에서 정보를 참조하십시오.

고급 옵션

ORM2를 사용하면 모델 정의에 대한 고급 조정을 할 수 있습니다. 설정을 통해 또는 모델을 설정할 때 define 하기 위해 호출을 통해이를 조정할 수 있습니다.

예를 들어, 각 모델 인스턴스는 데이터베이스에 고유 한 ID가 있으며이 테이블 열은 자동으로 추가되며 기본적으로 "id"라고합니다.
고유 한 key: true 열을 정의하면 "id"가 추가되지 않습니다.

1 2 3 4 5 6 7 8 9 10 11 12
var Person = db.define("person", { personId : { type: 'serial', key: true }, name : String }); // You can also change the default "id" property name globally: db.settings.set("properties.primary_key", "UID"); // ..and then define your Models var Pet = db.define("pet", { name : String });

Pet 모델에는 UIDname 두 개의 열이 있습니다.

복합 키를 가질 수도 있습니다.

1 2 3 4
var Person = db.define("person", { firstname : { type: 'text', key: true }, lastname : { type: 'text', key: true } });

다른 옵션들 :

  • identityCache : (기본값 : false ) 자격 증명 캐시 ( Singletons )를 활성화하거나 시간 초과 값 (초)을 설정하려면 true 로 설정하십시오.
  • autoSave : (default : false ) 속성을 변경 한 직후 인스턴스를 저장하려면 true 로 설정하십시오.
  • autoFetch : (기본값 : false ) 데이터베이스에서 인스턴스를 가져올 때 연결을 가져 오려면 true 로 설정하십시오.
  • autoFetchLimit : (기본값 : 1 ) autoFetch 가 활성화 된 경우 자동 페치하려는 후프 (연관 연결) 수를 정의합니다.

갈고리

위키 에서 정보를 참조하십시오.

아이템 찾기

Model.getSync(id, [ options ])

데이터베이스에서 특정 요소를 가져 오려면 Model.get 사용 Model.get .

1 2
var person = Person.getSync(123); // finds person with id = 123

Model.findSync([ conditions ] [, options ] [, limit ] [, order ])

하나 이상의 요소를 찾으려면 더 많은 옵션이 있으며 각 요소는 특정 매개 변수 순서로 제공 될 수 없으며 optionsconditions 이 뒤따라야 conditions (빈 개체 인 경우에도).

1 2
var people = Person.findSync({ name: "John", surname: "Doe" }, 3); // finds people with name='John' AND surname='Doe' and returns the first 3

제한적이거나 정렬을 원하기 때문에 결과를 정렬 해야하는 경우 :

1 2 3 4 5 6
var people = Person.findSync({ surname: "Doe" }, "name"); // finds people with surname='Doe' and returns sorted by name ascending people = Person.findSync({ surname: "Doe" }, [ "name", "Z" ]); // finds people with surname='Doe' and returns sorted by name descending // ('Z' means DESC; 'A' means ASC - default)

무언가를 찾기 위해 전달할 수있는 더 많은 옵션이 있습니다. 이러한 옵션은 두 번째 객체로 전달됩니다.

1 2
var people = Person.findSync({ surname: "Doe" }, { offset: 2 }); // finds people with surname='Doe', skips the first 2 and returns the others

검색 할 때 원시 SQL을 사용할 수도 있습니다. 아래 체인 섹션에 설명되어 있습니다.

Model.countSync([ conditions])

조건과 일치하는 항목 수를 계산하려면 모든 항목을 찾고 계산하는 대신 .count() 사용하면됩니다. 실제로 데이터베이스 서버에서 계산을 수행하도록 지시합니다 ( 노드 프로세스 자체).

1 2
var count = Person.countSync({ surname: "Doe" }); console.log("We have %d Does in our db", count);

Model.existsSync([ conditions])

.count() 와 유사 .count() 메소드는 카운트가 0보다 큰지 여부를 확인합니다.

1 2
var exists = Person.existsSync({ surname: "Doe" }); console.log("We %s Does in our db", exists ? "have" : "don't have");

Aggregating Functions

소수의 속성 만 선택하기 위해 속성 Array 을 전달할 수 있으며 조건을 정의하기 위해 Object 도 허용됩니다.

다음은 .groupBy() 사용 방법을 보여주는 예입니다.

1 2 3
//The same as "select avg(weight), age from person where country='someCountry' group by age;" var stats = Person.aggregate(["age"], { country: "someCountry" }).avg("weight").groupBy("age").getSync(); // stats is an Array, each item should have 'age' and 'avg_weight'

기본 .aggregate() 메소드

  • .limit() : 숫자를 한계로, 두 숫자를 각각 오프셋과 한계로 전달할 수 있습니다.
  • .order() : .order() 와 동일 Model.find().order()

추가 .aggregate() 메소드

  • min
  • max
  • avg
  • sum
  • count (이 Model.count 바로 가기가 있습니다)

드라이버에 따라 더 많은 집계 함수가 있습니다 (예 : 수학 함수).

Chaining

덜 복잡한 구문을 선호하는 경우 콜백 매개 변수를 제공하지 않으면 서 .find() 를 연결할 수 있습니다.

1 2 3
var people = Person.find({ surname: "Doe" }).limit(3).offset(2).only("name", "surname").runSync(); // finds people with surname='Doe', skips first 2 and limits to 3 elements, // returning only 'name' and 'surname' properties

당신은 그냥 IF 하나 이상의 속성 두 건너 뛰기하려면, 당신은 호출 할 수 있습니다 .omit() 대신 .only .

연결은보다 복잡한 쿼리를 허용합니다. 예를 들어, 사용자 지정 SQL을 지정하여 검색 할 수 있습니다.

1
Person.find({ age: 18 }).where("LOWER(surname) LIKE ?", ['dea%']).allSync( ... );

수동으로 IT의 나쁜 연습은 IT의 오류가 발생하기 쉬운 AS SQL 매개 변수를 탈출 및 SQL 인젝션로 응용 프로그램을 제공합니다. 앳는 ? 구문이 안전하게 매개 변수가 제공에서와 쿼리에서의 물음표에 대입하여, 당신을 위해 탈출을 처리합니다. 당신이 할 수있는 또 alberghiera 여러 사슬에 의해 where 필요에 따라 조항.

.find , .where &은 .all 것 같은 할, 그들은 교환 및 체인 방식 모두 있습니다.

당신은 또한 order 하거나 orderRaw 할 수 있습니다 :

1 2 3
Person.find({ age: 18 }).order('-name').allSync( ... ); // see the 'Raw queries' section below for more details Person.find({ age: 18 }).orderRaw("?? DESC", ['age']).allSync( ... );

또한 체인을 연결하고 결국 카운트를 얻을 수 있습니다.이 경우 오프셋, 제한 및 순서는 무시됩니다.

1 2
var people = Person.find({ surname: "Doe" }).countSync(); // people = number of people with surname="Doe"

선택한 항목을 제거하는 옵션도 사용할 수 있습니다. 체인 제거는 후크를 실행하지 않습니다.

1 2
Person.find({ surname: "Doe" }).removeSync(); // Does gone..

일반적인 Array traversal 방법을 사용하여 인스턴스를 수정하고 결국 모든 것을 저장할 수도 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13
Person.find({ surname: "Doe" }).each(function (person) { person.surname = "Dean"; }).save(function (err) { // done! }); Person.find({ surname: "Doe" }).each().filter(function (person) { return person.age >= 18; }).sort(function (person1, person2) { return person1.age < person2.age; }).get(function (people) { // get all people with at least 18 years, sorted by age });

물론 .find() 에서 직접 수행 할 수 있지만 더 복잡한 작업의 경우 매우 유용 할 수 있습니다.

Model.find() 는 배열을 반환하지 않으므로 직접 체인 할 수는 없습니다. 체인을 시작하려면 .each() 를 호출 .each() 목록을 탐색하려면 선택적 콜백을 사용하십시오). .sort() .filter() , .sort().forEach() 함수를 두 번 이상 사용합니다.

마지막으로 (또는 프로세스 중에 ..) 다음을 호출 할 수 있습니다.

  • .countSync() 얼마나 많은 항목이 있는지 알고 싶다면;
  • .getSync() 는 목록을 검색합니다.
  • 모든 항목 변경 사항을 저장하려면 .saveSync() .

조건

조건은 모든 키가 속성 (테이블 열) 인 객체로 정의되며 모든 키는 논리 AND 로 연결되어 있어야하며, Array 전달하지 않으면 값이 정확하게 일치하는 것으로 간주됩니다. 속성을 비교할 목록

1 2
{ col1: 123, col2: "foo" } // `col1` = 123 AND `col2` = 'foo' { col1: [ 1, 3, 5 ] } // `col1` IN (1, 3, 5)

다른 비교가 필요한 경우 일부 도우미 함수로 만든 특수 개체를 사용해야합니다.

1 2 3 4 5 6 7 8 9 10 11
{ col1: orm.eq(123) } // `col1` = 123 (default) { col1: orm.ne(123) } // `col1` <> 123 { col1: orm.gt(123) } // `col1` > 123 { col1: orm.gte(123) } // `col1` >= 123 { col1: orm.lt(123) } // `col1` < 123 { col1: orm.lte(123) } // `col1` <= 123 { col1: orm.between(123, 456) } // `col1` BETWEEN 123 AND 456 { col1: orm.not_between(123, 456) } // `col1` NOT BETWEEN 123 AND 456 { col1: orm.like(12 + "%") } // `col1` LIKE '12%' { col1: orm.not_like(12 + "%") } // `col1` NOT LIKE '12%' { col1: orm.not_in([1, 4, 8]) } // `col1` NOT IN (1, 4, 8)

원시 쿼리

1 2 3 4 5 6 7 8 9 10 11 12 13
var data = db.driver.execQuerySync("SELECT id, email FROM user") // You can escape identifiers and values. // For identifier substitution use: ?? // For value substitution use: ? var data = db.driver.execQuerySync( "SELECT user.??, user.?? FROM user WHERE user.?? LIKE ? AND user.?? > ?", ['id', 'name', 'name', 'john', 'id', 55]) // Identifiers don't need to be scaped most of the time var data = db.driver.execQuerySync( "SELECT user.id, user.name FROM user WHERE user.name LIKE ? AND user.id > ?", ['john', 55])

Identity pattern

ID 패턴 (기본적으로 해제되어 있음)을 사용할 수 있습니다. 활성화 된 경우 여러 개의 다른 쿼리는 동일한 결과를 가져옵니다-동일한 개체를 얻습니다. 데이터베이스를 변경할 수있는 다른 시스템이 있거나 일부 매뉴얼을 호출해야하는 경우 SQL 쿼리에서는이 기능을 사용해서는 안되며 복잡한 자동 페치 관계에 일부 문제가 발생할 수 있으므로 사용자가 위험을 감수해야합니다.

모델별로 활성화 / 비활성화 할 수 있습니다.

1 2 3 4 5
var Person = db.define('person', { name : String }, { identityCache : true });

또한 전 세계적으로 :

1 2
var db = orm.connectSync('...'); db.settings.set('instance.identityCache', true);

부울 대신 숫자를 전달하여 일정 기간이 지나면 자격 증명 캐시를 만료하도록 구성 할 수 있습니다.이 숫자는 초 단위의 캐시 시간 초과로 간주됩니다 (부동 소수점을 사용할 수 있음).

참고 : 캐싱에 대한 한 가지 예외는 인스턴스가 저장되지 않은 경우 사용되지 않는다는 것입니다 (예 : Person을 가져 와서 변경 한 경우 저장하지 않은 경우 캐시에서 전달되지 않음).

아이템 만들기

Model.createSync(items)

데이터베이스에 새 요소를 삽입하려면 Model.create 사용 Model.create .

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var items = Person.createSync([ { name: "John", surname: "Doe", age: 25, male: true }, { name: "Liza", surname: "Kollan", age: 19, male: false } ]); // items - array of inserted items

항목 업데이트

반환 된 모든 항목에는 모델에 정의 된 속성과 각 항목을 변경하는 데 사용할 수있는 몇 가지 방법이 있습니다.

1 2 3 4 5
var John = Person.getSync(1); John.name = "Joe"; John.surname = "Doe"; John.saveSync(); console.log("saved!");

한 번의 호출로 인스턴스 업데이트 및 저장을 수행 할 수 있습니다.

1 2 3
var John = Person.getSync(1); John.saveSync({ name: "Joe", surname: "Doe" }); console.log("saved!");

인스턴스를 제거하려면 다음을 수행하십시오.

1 2 3 4
// you could do this without even fetching it, look at Chaining section above var John = Person.getSync(1); John.removeSync(); console.log("removed!");

검증

위키 에서 정보를 참조하십시오.

협회

연관은 하나 이상의 테이블 간의 관계입니다.

hasOne

대일 관계이며 소속 과 동일 합니다.
예 : Animal.hasOne('owner', Person) .
동물은 한 명의 소유자 만 가질 수 있지만 사람은 많은 동물을 가질 수 있습니다.
Animal은 owner_id 속성이 자동으로 추가됩니다.

다음과 같은 기능을 사용할 수 있습니다.

1 2 3 4
animal.getOwnerSync() // Gets owner animal.setOwnerSync(person) // Sets owner_id animal.hasOwnerSync() // Checks if owner exists animal.removeOwnerSync() // Sets owner_id to 0

체인 찾기

hasOne 연관도 체인 찾기와 호환됩니다. 위의 예제를 사용하여 ChainFind 객체의 새 인스턴스에 액세스 할 수 있습니다.

1
Animal.findByOwner({ /* options */ })

역 접근

1
Animal.hasOne('owner', Person, {reverse: 'pets'})

다음을 추가합니다 :

1 2 3 4 5 6
// Instance methods person.getPetsSync(function..) person.setPetsSync(cat, function..) // Model methods Person.findByPets({ /* options */ }) // returns ChainFind object

hasMany

대다 관계입니다 (결합 테이블 포함).
예 : Patient.hasMany('doctors', Doctor, { why: String }, { reverse: 'patients', key: true }) .
환자마다 다른 의사가있을 수 있으며, 각 의사마다 다른 환자가있을 수 있습니다.

이렇게하면 Patient.sync() 를 호출 할 때 조인 테이블 patient_doctors 가 생성됩니다.

열 이름 타입
patient_id 정수 (복합 키)
doctor_id 정수 (복합 키)
바 차르 (255)

다음 기능을 사용할 수 있습니다 :

1 2 3 4 5 6 7 8 9 10 11 12
patient.getDoctorsSync() // List of doctors patient.addDoctorsSync(docs) // Adds entries to join table patient.setDoctorsSync(docs) // Removes existing entries in join table, adds new ones patient.hasDoctorsSync(docs) // Checks if patient is associated to specified doctors patient.removeDoctorsSync(docs) // Removes specified doctors from join table doctor.getPatientsSync() etc... // You can also do: patient.doctors = [doc1, doc2]; patient.saveSync()

의사를 환자와 연관 시키려면 다음을 수행하십시오.

1
patient.addDoctorSync(surgeon, {why: "remove appendix"})

{patient_id: 4, doctor_id: 6, why: "remove appendix"} 가 조인 테이블에 추가됩니다.

getAccessor

이 유형의 연결에서이 접근자는 콜백을 전달하지 않으면 ChainFind 반환하므로 ChainFind 과 같은 작업을 수행 할 수 있습니다.

1 2
var doctors = patient.getDoctors().order("name").offset(1).runSync()); // ... all doctors, ordered by name, excluding first one

extendsTo

선택적 속성을 다른 테이블 또는 컬렉션으로 분할하려는 경우 모든 확장은 새 테이블에 있으며 각 행의 고유 식별자는 기본 모델 인스턴스 ID입니다.

1 2 3 4 5 6 7
var Person = db.define("person", { name : String }); var PersonAddress = Person.extendsTo("address", { street : String, number : Number });

그러면 idname 열이있는 테이블 person 이 생성되고 확장이 person_id , streetnumber 열이있는 person_address 테이블을 생성합니다 Person 모델에서 사용 가능한 메소드는 hasOne 연관과 유사합니다. .getAddress(cb) , .setAddress(Address, cb) , ..

참고 : Person.extendsTo 의 결과를 저장할 필요는 없습니다. 확장 모델을 반환합니다.이 확장 테이블을 직접 쿼리하고 관련 모델을 찾는 데 사용할 수 있지만 사용자에게 달려 있습니다. 원래 모델을 사용하여 액세스하려면 반품을 버릴 수 있습니다.

Examples & options

1과 n의 관계가있는 경우 hasOne (포함) 연결을 사용해야합니다.

1 2 3 4 5 6 7 8 9 10 11 12 13
var Person = db.define('person', { name : String }); var Animal = db.define('animal', { name : String }); Animal.hasOne("owner", Person); // creates column 'owner_id' in 'animal' table // get animal with id = 123 var animal = Animal.getSync(123); // animal is the animal model instance, if found var person = animal.getOwnerSync(); // if animal has really an owner, person points to it

required 옵션을 지정하여 데이터베이스에서 owner_id 필드를 필수로 표시 할 수 있습니다.

1
Animal.hasOne("owner", Person, { required: true });

필드가 필요하지 않지만 필드가 없어도 유효성을 검증해야하는 경우 alwaysValidate 옵션을 지정하십시오 (예 : 널 필드의 유효성 검증이 레코드의 다른 필드에 의존하는 경우 발생할 수 있음)

1
Animal.hasOne("owner", Person, { required: false, alwaysValidate: true });

필드 (owner_id)에 다른 이름을 사용하려면 설정에서이 매개 변수를 변경할 수 있습니다.

1
db.settings.set("properties.association_key", "{field}_{name}"); // {name} will be replaced by 'owner' and {field} will be replaced by 'id' in this case

참고 : 연결을 지정하기 전에 수행해야합니다.

hasMany 연관은 연관 테이블에 추가 특성을 가질 수 있습니다.

1 2 3 4 5 6 7 8 9 10 11
var Person = db.define('person', { name : String }); Person.hasMany("friends", { rate : Number }, {}, { key: true }); var John = Person.getSync(123); var friends = John.getFriendsSync(); // assumes rate is another column on table person_friends // you can access it by going to friends[N].extra.rate

원하는 경우 autoFetch 를 활성화 할 수 있습니다.이 방법으로 모델의 인스턴스를 가져 오거나 찾을 때 연관이 자동으로 페치됩니다.

1 2 3 4 5 6 7 8 9 10 11 12
var Person = db.define('person', { name : String }); Person.hasMany("friends", { rate : Number }, { key : true, // Turns the foreign keys in the join table into a composite key autoFetch : true }); var John = Person.getSync(123); // no need to do John.getFriends() , John already has John.friends Array

또한 연결 기준 대신이 옵션을 전체적으로 정의 할 수도 있습니다.

1 2 3 4 5 6 7 8 9 10
var Person = db.define('person', { name : String }, { autoFetch : true }); Person.hasMany("friends", { rate : Number }, { key: true });

연결은 reverse 옵션을 사용하여 연결된 모델을 호출 할 수 있습니다 (예 : ModelA에서 ModelB 로의 연결이있는 경우 ModelB에서 접근자를 만들어 ModelA에서 인스턴스를 가져올 수 있음) 다음 예를 살펴보십시오.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
var Pet = db.define('pet', { name : String }); var Person = db.define('person', { name : String }); Pet.hasOne("owner", Person, { reverse : "pets" }); var pets = Person(4).getPetsSync(); // although the association was made on Pet, // Person will have an accessor (getPets) // // In this example, ORM will fetch all pets // whose owner_id = 4

hasMany 연관이있을 때 양쪽에서 많은 연관을 관리 할 수 ​​있으므로 훨씬 더 의미가 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var Pet = db.define('pet', { name : String }); var Person = db.define('person', { name : String }); Person.hasMany("pets", Pet, { bought : Date }, { key : true, reverse : "owners" }); Person(1).getPetsSync(...); Pet(2).getOwnersSync(...);

거래 지원

저수준 트랜잭션 기능을 사용하여 db 변환을 처리 할 수 ​​있습니다.

1 2 3 4 5 6
db.begin(); ... if(err) db.rollback(); else db.commit();

또는 trans를 사용하여 처리를 단순화 할 수 있습니다.

1 2 3 4
var result = db.trans(() => { ... return result; });

외부 데이터베이스 어댑터 추가

외부 데이터베이스 어댑터를 orm 추가하려면 addAdapter 메소드를 호출하여이 어댑터와의 연결에 사용할 별명을 어댑터의 생성자와 함께 전달하십시오.

1
require('orm').addAdapter('cassandra', CassandraAdapter);

자세한 내용 the documentation for creating adapters 참조하십시오.