멋진 커뮤니티 모듈

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"; }); }); }); }); });

선적 서류 비치

Fibjs 새로운 기능을 추가하지 않은, 노드 ORM을 참조 할 수있는 문서의 개발 만 동기 버전으로 비동기 호출을 변경해야합니다. 위키 .

설정

Wiki의 정보를 참조하십시오.

연결

Wiki의 정보를 참조하십시오.

모델

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

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

모델 정의

Wiki의 정보를 참조하십시오.

Properties

Wiki의 정보를 참조하십시오.

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 }); };

모델 동기화

Wiki의 정보를 참조하십시오.

모델 삭제

Wiki의 정보를 참조하십시오.

고급 옵션

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

예를 들어 각 Model 인스턴스에는 데이터베이스에서 고유 한 ID가 있습니다.이 테이블 열은 자동으로 추가되며 기본적으로 "id"라고합니다.
고유 한 key: true 를 정의하는 경우 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 });

애완 동물 모델에는 2 개의 열, UIDname 있습니다.

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

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

다른 옵션:

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

후크

Wiki의 정보를 참조하십시오.

항목 찾기

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() : Model.find().order() 와 동일

추가 .aggregate() 메서드

  • min
  • max
  • avg
  • sum
  • count (this- 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

당신은 단지 하나 또는 두 개의 속성을 생략하려는 경우, 당신은 호출 할 수 있습니다 .omit() 대신 .only .

체이닝은 더 복잡한 쿼리를 허용합니다. 예를 들어 사용자 정의 SQL을 지정하여 검색 할 수 있습니다.

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

오류가 발생하기 쉽고 애플리케이션이 SQL 주입에 노출되므로 SQL 매개 변수를 수동으로 이스케이프하는 것은 좋지 않습니다. ? 구문은 쿼리의 물음표를 제공된 매개 변수로 안전하게 대체하여 이스케이프 처리를 처리합니다. 또한 여러 where 연결할 수 있습니다. 필요에 따라 절.

.find , .where & .all do Thing the Same; All .all are interchangeable and chainable.

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..

일반적인 배열 탐색 방법을 사용하여 인스턴스를 수정하고 마지막에 모든 것을 저장할 수도 있습니다. [NOT SUPPORT]

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() 목록을 탐색하려는 경우 선택적 콜백 사용). 그런 다음 common을 사용할 수 있습니다. functions .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);

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

참고 : 캐싱에 대한 한 가지 예외는 인스턴스가 저장되지 않으면 사용되지 않는다는 것입니다. 예를 들어 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!");

검증

Wiki의 정보를 참조하십시오.

협회

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

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 정수 (복합 키)
varchar (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 반환합니다. 즉, 다음과 같은 작업을 수행 할 수 있습니다.

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 (belongs to) 연관을 사용해야합니다.

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 옵션을 지정합니다 (예 : null 필드의 유효성 검사가 레코드의 다른 필드에 따라 달라지는 경우).

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 옵션을 사용하여 연결된 Model을 호출 할 수 있습니다. 예를 들어 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 참조하십시오.