pg-generator bu modülün bir sonraki versiyonudur. Çok daha sezgisel, uyarlanabilir ve kolay kullanımlıdır.
Sequelize'den daha fazlasını oluşturabilir. Üstelik Sequelize'ı da daha iyi oluşturur.
pg-generator linkleri:
- pg-generator sequelize sayfası
- npm
- github
- web
Bu modül PostgreSQL veri tabanındann otomatik olarak Sequelize modellerini oluşturur. Veri tabanınızı inceleyerek her bir tablo için ayrı bir model dosyası oluşturur. Varsayılan konfigürasyon ayarları olabildiğince dikkatli seçilmiştir ve doğrudan değişiklik yapmadan kullanıma uygundur. Yine de dilerseniz konfigürasyon aracılığı ile bir çok davranış biçimini değiştirebilirsiniz. Bu doküman varsayılan konfigürasyona göre hazırlanmıştır. Dokümanda ilgili yerlerde konfigürasyon parametreleri ve varsayılan değerleri (Konfigürasyon parametresi:varsayılan değer) şeklinde belirtilmiştir.
Bu şekilde modülü ve CLI komutunu kurmuş olursunuz.
$ npm install -g sequelize-pg-generator
Open terminal, go to your app.js root and create your models automatically into 'model' directory.
$ cd path/to/my/node-app.js
$ spgen -d my_database -u my_user -p my_password
Kendi uygulamanızda otomatik olarak oluşturulmuş olan Sequelize modellerini kullanın. Aşağıda örnekler bulabilirsiniz.
var orm = require('./model');
orm.setup('veri_tabanim', 'kullanıcı', 'sifre', {
host: '127.0.0.1',
logging: false,
native: false
});
var sequelize = orm.sequelize;
var contact = orm.model('public.contact'); // Şema kullanmayacak şekilde konfigüre edilebilir.
Windows işletim sisteminde kurulum yapmak için bazı ipuçları. Bu modül pg modülünü kullanır. Eğer Windows üzerinde pg-native modülünü kullanmak isterseniz aşağıdaki noktalara dikkat ederek kurabilirsiniz:
-
Python 2 kurulu olmalı. Bu yazı yazılırken Python 3 uyumluluğu yoktu.
-
Python'un kurulu olduğu klasörü çevresel değişkenlerden (environment variables) path ve PYTHONPATH içine eklemelisiniz.
-
PostgreSQL pg_config ve libpg.dll içeren klasörler'de path içine eklenmiş olmalı. Genellikle PostgreSQL bin ve lib klasörlerini eklemeniz yeterlidir. (Örneğin: C:\Program Files\PostgreSQL\9.3\bin C:\Program Files\PostgreSQL\9.3\lib)
-
Visual Studio Build Tools (C:\Program Files (x86)\MSBuild) sisteminizde kurulu olmalı. VS 2012 sonrasında otomatik olarak kurulmaktadır. Eğer bu modülün kurulumu sırasında npm farklı bir Visual Studio sürümü sorarse sizde kurulu versiyonu aşağıdaki gibi kullanabilirsiniz:
npm install -g sequelize-pg-generator --msvs_version=2013
spgen [seçenekler]
-h, --host [host] Veri tabanının IP adresi veya host ismi.
--port [port] Veri tabanına bağlanmak için kullanılacak port
-d, --database [veri tabanı] Veri tabanı ismi
-u, --user [kullanıcı] Veri tabanına bağlanmak için kullanıcı ismi
-p, --password [şifre] Veri tabanına bağlanmak için şifre
-s, --schema [schema] Virgülle ayrılmış veri tabanı şemaları ismi (boşluk olmamalı).
-o, --output [output] Dosyaların üretileceği yer.
-c, --config [config] Konfigürasyon dosyasının yeri.
-t, --templateName Hazır template klasörlerinden verilen isimde olanı kullanılır.
--nolog Log çıktısı yazmayı durdurur.
--resetConfig Konfigürasyonu resetler. (Yan yol. Yayında kullanılması önerilmez.)
--throwError Hatayı konsola yazmak yerine error çıktısı üretir.
- Tamamen dokümante edilmiştir. (JSDoc HTML dosyaları doc dizini altındadır.),
- Test edilmiştir,
- Üretilen dosyalar başka bir modül gerektirmez,
- Çoklu PostgreSQL şema (schema) detseği,
- Tekten çoğa (One to many) ilişki desteği (hasMany ve belongsTo),
- Çoktan çoğan (Many to many) ilişki desteği (hasMany through ve belongsToMany),
- Şemalar arası ilişki desteği. (Örneğin public.firma tablosundan ozel_sema.musteri tablosuna),
- Yüksek oranda konfigüre edilebilir,
- Tamamen özelleştirilebilir,
- CLI desteği,
- Model ve ilişkiler için akıllı isimlendirme,
- Otomatik üretilen dosyalara kolayca müdahale,
- Hariç tutulan tablolar,
- Debug,
- Tabloya özel konfigürasyon,
- İsimleri ve alias'leri kontrol ederek çakışmaları önler.
Sequelize 2.0 RC3 ve öncesi sürümlerde çoktan çoğa (many to many) ilişkiler için belongsToMany özelliği yoktur. Bu versiyondan sonra ise hasMany through ilişkiler ise yayından kalkacaktır (deprecated). Bu konuyla ilgili davranış konfigürasyonla ayarlanabilir. (Config: generate.hasManyThrough:false and generate.belongsToMany:true)
Üretilen dosyalar çekirdek node modülleri ve Sequelize dışında herhangi bir modül gerektirmez.
Çoklu PostgreSQL şemalarını destekler. public dışında şemaları da kullanabilirsiniz. Kullanıcı komut satırından veya konfigürasyon dosyasından hangi şemaların işleneceğini seçebilir. Birden fazla şema dahil edilmesi durumunda modeller başına şema isimleri eklenerek ile beraber üretilebilir. (Config: generate.useSchemaName: true, database.schema: ["public"]) Bu sayede değişik şemalardaki aynı isimli tablolarda çakışma yaşanmaz.
contact = orm.model('public.kisi'); // kisi tablosu için Sequelize modelini verir.
Kullanıcı isterse model isimlerine şema ismi eklenmesini durdurabilir.
// Konfigürasyon dosyasında
{...
generate{
useSchemaName: false
}
}
contact = orm.model('kisi'); // kisi tablosu için Sequelize modelini verir.
Bu modül otomatik olarak tekten çoğa ilişkileri tespit eder ve model.hasMany ve model.belongsTo sequelize ilişkilerini oluşturur.
Eğer iki tablo bir ara birleşim tablosu ile bağlıysa, sequelize-pg-generator otomatik olarak bunu tespit eder ve many to many sequelize ilişkisini oluşturur. Eğer bir tabloda birden fazla yabancı anahtar (foreign key) varsa o tablo ara bağlantı tablosu kabul edilir.
hasMany hasMany
TABLO: urun ------------< kalem >------------ sepet
ALANLAR: id sepet_id (FK) id
isim urun_id (FK) musteri_id (FK)
renk miktar
Bu modül belongsToMany ilişkilerini ve hasMany through ilişkilerini otomatik oluşturabilir. Bu yazı tarihi ile Sequelize master dalı hasMany through ilişkilerini kaldırılacak (deprecated) olarak işaretledi. Kullandığınız Sequelize versiyonuna göre istediğiniz ilişki türünün oluşturulmasını konfigürasyondan ayarlayabilirsiniz.
Değişik şemalarda bulunan tablolar arasındaki ilişkileri tespit eder. Örneğin public.firma tablosundan ozel_sema.musteri tablosuna olan ilişki tespit edilebilir.
sequelize-pg-generator konfigürasyon için config mdülünü kullanır. Ayrıca CLI vasıtası ile çağırırken de özel bir konfigürasyon dosyası kullanabilirsiniz. Konfigürasyon parametrelerinin açıklamalarını bu dokümanda aşağıda bulabilirsiniz.
sequelize-pg-generator model dosyalarını üretmek için consolidate uyumlu template'leri kullanır. Varsayılan template engine olarak Swig kullanılmaktadır. Kullanıcı orjinal template'lere dokunmadan kendi taslaklarının olduğu yeri konfigürasyon aracılığı ile belirterek onların kullanılmasını sağlayabilir. (Config: template.folder and template.engine:'swig') Kendi template'lerini kullanmak isteyenlerin bu modülün template dizinini incelemeri önerilir.
Özel template dizininde en azından şu üç dosya bulunmalıdır. index.ext Varsayılan template dosyası. ext yerine kendi template'lerinizi uzantısını yazın. index.js Bu dosya üretilen dosyalarla beraber kopyalanır. Amacı üretilen dosyaları kullanmaktır. utils.js Bu dosya üretilen dosyalarla beraber kopyalanır. Yardımcı fonksiyonlar içerir.
Eğer bu modülü önerildiği gibi npm -g ile global olarak kurduysanız spgen komutu model dosyaları üretmek için sisteminizde her yerden kullanılabilir.
Eğer otomatik oluşturulan ilişki isimleri sizin için yeterince akıllı değilse, bu isimleri kolayca değiştirebilirsiniz. İlk kullanımdan sonra hedef klasörde alias.json
isimli bir dosy oluşturulacaktır. Oluşturulan her ilişki ismi bu dosyada mevcuttur. Değiştirmek istediğiniz ismi burada tanımlarsanız, ileride model dosyaları oluşturulurken buradaki isimlere öncelik verilecektir. Bazı isimler sizin için uygunsa değerini null olarak bırakın.
sequelize-pg-generator model isimlendirmesi için tablo veya şema.tablo isimlendirmesini kullanır. İlişkiler için yabancı anahtar isimlerini ve veri tabanında tanımlı ilişki isimlerini kullanır. (Veri tabanında ilişkileri düzgün isimlendiriyorsunuz değil mi?) Konfigürasyondan ayarlanarak camel case (tabloAdi) veya dokunulmamış (tablo_adi) şekilde isimlendirilmiş metodlar kullanılabilir. İsimlendirme teamülleri Sequelize modülü tavsiyelerine göre ayarlanmıştır ve 'as' parametresine atama yapılarak isimlendirme yapılır.
product_cart_line_items cart_cart_line_items
TABLO: product -------------------------< line_item >--------------------- cart
ALANLAR: id cart_id (FK) id
name product (FK) customer_id (FK)
color quantity
DİKKAT: line_item.cart_id alanı _id son eki içermesine rağmen line_item.product _id son eki içermemektedir. Bu tutarsız gibi gözüken durum kasten bu örnek için yapılmıştır.
Nesne Tipi İsimlendirme Kuralı
---------- -------------------
Model tabloAdi veya schema.tabloAdi
hasMany Veri tabanındaki ilişki adının çoğulu. Baştaki tablo adı otomatik silinebilir.
(Config: generate.stripFirstTableFromHasMany:true)
belongsTo Yabancı anahtarın tekil hali. Eğer dış anahtar ismi _id iel bitiyorsa silinir. Aksi durumda
alan ismi ile çakışmaması için başına 'related' ön eki eklenir.
(Config: generate.prefixForBelongsTo:'related')
belongsToMany Birleşim tablosu adı + birleşim tablosundaki diğer tabloya işaret eden yabancı anahtarın çoğul hali.
hasMany({through:..}) Birleşim tablosu adı + birleşim tablosundaki diğer tabloya işaret eden yabancı anahtarın çoğul hali. (Sequelize'de kaldırılacak)
Örnek yapı için sonuçlar:
İlişki as Detaylar
------ -- --------
product.hasMany as:'cartLineItems' (Çoğul) 'product' tablo ismi 'product_cart_line_items' ilişki
isminin başından silinmiştir.
product.belongsToMany as:'cartLineItemCarts' (Çoğul) _id eki 'cart_id' yabancı anahtar isminin sonundan
silinmiştir ve başına ilişki adı başındaki tablo adı olmadan eklenmiştir.
product.hasMany Through as:'cartLineItemCarts' (Çoğul) _id eki 'cart_id' yabancı anahtar isminin sonundan
silinmiştir ve başına ilişki adı başındaki tablo adı olmadan eklenmiştir.
cart.hasMany as:'cartLineItems' (Çoğul) 'cart' tablo ismi 'cart_cart_line_items' ilişki
isminin başından silinmiştir.
cart.belongsToMany as:'relatedCartLineItemProducts' (Çoğul) _id eki olmadığından 'related' ön eki ve başına ilişki adı
başındaki tablo adı olmadan eklenmiştir.
cart.hasMany Through as:'relatedCartLineItemProducts' (Çoğul) _id eki olmadığından 'related' ön eki ve başına ilişki adı
başındaki tablo adı olmadan eklenmiştir.
lineItem.belongsTo as:'relatedProduct' (Tekil) _id eki olmadığından 'related' ön eki eklenmiştir.
lineItem.belongsTo as:'cart' (Tekil) _id eki 'cart_id' yabancı anahtar isminin sonundan silinmiştir.
Bir çok özellik gibi, oluşturulan dosyalara yıkıcı olmayan bir şekilde aşağıda açıklandığı şekilde müdahale edebilirsiniz.
Varsayılan olarak otomatik oluşturulan dosyalar path/to/model/definition-files dizininde tutulur. Ayrıca burada 'definition-files-custom' isimli bir dizin de oluşturulur. Kullanıcılar 'definition-files-custom' dizininde model dosyaları ile aynı isimde dosyalar oluşturarak orjinal dosyaların içeriğini değiştirebilir ve gerekli müdahaleleri güvenli bir şekilde yapabilirler. Bu modifikasyonları daha da kolay hale getirmek için utils isimli bir modül de model dizininde oluşturulur.
Bu modifikasyonlar yıkıcı değildir, çünkü bu dosyalar orjinal dosyadan miras alarak (inherit) orjinal dosyaya dokunulmadan değişiklik yapma şansı tanırlar. Varsayılan index.js dosyası miras alan bu dosya mevcut ise orjinal dosyayı çağırmaz ve miras alan dosyayı kullanır. Burada dikkat edilmesi gereken bu müdahalelerin henüz Sequelize nesnesi oluşturulmadan önce yapılıyor olmasıdır.
Örneğin cart isimli tablo için 'definition-files/cart.js' dosyası oluşturulur. Kullanıcı 'definition-files-custom/cart.js' isimli bir dosya oluşturarak aşağıdaki örnekte olduğu gibi istediği özelliklere müdahale edebilir. Tüm özellikler için otomatik oluşturulmuş dosyaların içine bakabilirsiniz.
"use strict";
var orm = require('../index.js'),
model = require('../definition-files/public_cart.js'),
util = require('../utils.js')(model),
Seq = orm.Sequelize();
module.exports = model;
util.getAttribute('id').validate = {... Some Sequelize Validations}; // Sequelize validation ekleyin.
util.getRelation('relatedProducts').details.as = 'soldItems'; // Varsayılan ilişki ismini beğenmediniz mi? Değiştirin.
util.renameAttribute('customerId', 'clientId'); // Alanın ismini değiştirin.
Bazı tabloların otomatik üretimin dışında bırakılması mümkündür. Konfigürasyonda (Config generate.skipTable:[]) dizisi hariç bırakılacak tabloları tanımlamak için kullanılır. sequelize-pg-generator bu tabloları ve ayrıca bu tablolara olan ve bu tablolardan başka tablolara olan ilişkileri oluşturmaz.
Sizin yazdığınız uygulamadan ilk çağrılıp çalıştırıldığında, varsayılan index.js dosyası model dizininde debug.js isimli bir dosya oluşturur. Bu dosya incelenerek index.js'nin ne tip bir kod kullandığı anlaşılabilir. index.js dosyası yerine doğrudan modeller kullanılmak istenseydi bu şekilde bir kod kullanılıyor olacaktı. Ancak bu tip statik bir dosya kullanılsaydı, yıkıcı olmayan bir şekilde müdahalelere izin vermek çok zor olacaktı.
sequelize-pg-generator isim çakışmalarını önlemek için aynı tabloda aynı isim/alias sahibi başka bir alan veya ilişki var mı kontrol eder. Varsa uyarır.
Bazı tablolar için diğer tablolardan farklı olarak özel kurallar tanımlamak gerekebilir. Bu gibi durumlarda konfigürasyon tablo seviyesinde özel değişikliklere izin verir. Tüm 'generate' ve 'tableOptions' başlığı altında toplanan konfigürasyon parametreleri 'generateOverride' and 'tableOptionsOverride' başlıkları ile tabloya özel olarak değiştirilebilir.
Aşağıdaki örnekte contact tablosunun kendine özgü konfigürasyonlara sahip olması gösterilmiştir.
"generate": {
"columnDescription": true,
"tableDescription": true,
...
},
"generateOverride": {
"contact": {
"tableDescription": false
}
},
"tableOptions": {
"timestamps": false,
"camelCase": true,
"paranoid": false,
...
},
"tableOptionsOverride": {
"contact": {
"paranoid": true
}
}
...
Konfigürasyon parametreleri ve varsayılan değerleri aşağıda açıklanmıştır. Konfigürasyon "sequelize-pg-generator" anahtarı altında toplanmıştır, çünkü sequelize-pg-generator konfigürasyonunuzu kendi uygulamanız içerisindeki konfigürasyon ile birleştirmek isteyebilirsiniz. Bu seyede sequelize-pg-generator konfigürasyon ayarlarının isimleri sizin konfigürasyonunuzla çakışmaz. config buna izin vermektedir.
host | string | Veri tabanının IP adresi veya host ismi. |
port | number | Veri tabanına bağlanmak için kullanılacak port. |
database | string | Veri tabanı ismi. |
user | string | Veri tabanına bağlanmak için kullanıcı ismi. |
password | string | Veri tabanına bağlanmak için şifre. |
schema | Array(string) | Otomatik dosyaların üretileceği veri tabanı şemaları ismi. |
engine | string | Dosyaları üretmek için kullanılacak olan template engine. [consolidate](https://www.npmjs.com/package/consolidate) uyumlu tüm engine'ler kullanılabilir. |
extension | string | Template dosyalarının dosya uzantısı. |
folder | string | Template dosyalarının yer aldığı dizin. |
log | boolean | Otomatik dosyaları üretirken log çıktısı üret. |
folder | string | Dosyaların üretileceği yer. |
beautify | boolean | Dosyaları [js-beautifier](http://jsbeautifier.org) kullanarak formatla. |
indent | number | Üretilen dosyalarda her bir tab karakteri için kaç boşluk kullanılacağı. |
preserveNewLine | boolean | Üretilen dosyada taslaklardan gelen yeni satır (new line) karakterlerini koru. |
warning | boolean | Eğer true olarak ayarlanırsa otomatik dosyalara ilgili dosyaya nasıl müdahale edileceğini anlatan bir yorum (comment) eklenir. |
stripFirstTableFromHasMany | boolean | Eğer true olrak ayarlanırsa has many ilişkilerinde ilişkinin isminde eğer varsa ilk baştaki tablo adı silinir. Örneğin: "product" tablosu için "product_cart_line_items" ilişki ismi "cart_line_items" olarak isimlendirilir. |
addTableNameToManyToMany | boolean | Eğer true olarak ayarlanırsa çoktan çoğa olan ilişkilerde (many to many) ilişkinin ismi'nin (as parametresi) başına birleşim tablosunun ismi eklenir. Bu isim çakışmalarını önlemekte yardımcı olur. |
addRelationNameToManyToMany | boolean | Eğer true olarak ayarlanırsa çoktan çoğa olan ilişkilerde (many to many) ilişkinin ismi'nin (as parametresi) başına ilişki ismi eklenir. Bu isim çakışmasını addTableNameToManyToMany seçeneğine göre daha iyi önler, çünkü aynı birleşim tablosuna ikiden fazla tablo bağlı olabilir. |
stripFirstTableNameFromManyToMany | boolean | Eğer true olrak ayarlanırsa çoktan çoğa (many to many) ilişkilerinde ilişkinin isminde eğer varsa ilk baştaki tablo adı silinir. Örneğin: "product" tablosu için "product_cart_line_items" ilişki ismi "cart_line_items" olarak isimlendirilir. |
hasManyThrough | boolean | Has many through ilişkileri hasMany(modelName, { through: '..' } şeklinde yapılandırılır. Sequelize version 2.0 RC3 ve sonrasında has many through ilişkileri kaldırılacak (DEPRECATED) olarak işaretlenmiştir. Bu versiyondan sonra has many through yerine belongToMany kullanmalısınız. hasManyThrough ve belongsToMany aynı tabloda aynı anda true olamaz. |
belongsToMany | boolean | belongsToMany ilişkileri kullanılır. Bu ilişki türü Sequelize version 2.0 RC4 ve sonrasında gelmiştir. Önceki Sequelize versiyonları bu ayar true iken çalışmazlar. hasManyThrough ve belongsToMany aynı tabloda aynı anda true olamaz. |
prefixForBelongsTo | string | belongsTo ilişkileri yabancı anahtar isminden "_id" eki atılarak isimlendirilir. Eğer yabancı anahtar "_id" eki içermiyorsa belongsTo ilişkilerinin alan isimleri ile karışmasını önlemek için başına bu ayarda belirtilen ön ek eklenir. "Model ve İlişkiler İçin Akıllı İsimlendirme" bölümüne bakabilirsiniz. |
useSchemaName | boolean | Eğer true olarak ayarlanırsa oluşturulan dosya isimlerinin ve model isimlerinin başına model isimleri eklenir. Bu ayar çoklu şema kullanan veri tabanlarında değişik şemalarda aynı isimdeki tabloların çakışmasını önlemek için kullanılır. |
modelCamelCase | boolean | Şema isimlerinde camel case (schemaName gibi) kullanılmasını sağlar. |
relationAccessorCamelCase | boolean | İlişki accessor metodlarında camel case (relationName gibi) kullanılmasını sağlar. |
columnAccessorCamelCase | boolean | Alan accessor metodlarında camel case (alanAdi gibi) kullanılmasını sağlar. |
columnDefault | boolean | Veri tabanı alanlarındaki varsayılan değerlerin Sequelize modelinde de oluşturulmasını sağlar. UYARI: SQL fonksiyonları henüz desteklenmemektedir. Sequelize'nin istediği şekilde bunları oluşturmak zordur. Bu nedenle bu işin veri tabanı sisteminde halledilmesi daha doğru olacaktır. Öte yandan bu değeri true yapıp, hatalı alanları müdahale ederek değiştirebilirsiniz. |
columnDescription | boolean | Alan açıklamalarını oluşturulan modele ekle. |
columnAutoIncrement | boolean | Otomatik artırım (auto increment) alanlarının modelde işaretlenmesini sağla. |
tableDescription | boolean | Tablo açıklamalarını oluşturulan modele ekle. |
dataTypeVariable | string | Sequelize veri tiplerini tanımlamak için nesneye bağlı "Sequelize.BOOLEAN" gibi bir değişken kullanır.This ayar bu değişkenin isminin ayarlanmasını sağlar. |
skipTable | Array(string) | Hariç tutulan tabloların listesi. |
Kullanıcı buraya istediği Sequelize.define opsiyonlarını (options) ekleyebilir. Bu opsiyonlar doğrudan Sequelize.define metoduna iletilir. Opsiyonlar için Sequelize dokümantasyonu incelenebilir. Bazı örnekler: | ||
timestamps | boolean | createdAt ve updatedAt zaman damgası alanlarını modele ekler. |
Varsayılan konfigürasyon ayarları aşağıda listelenmiştir.
module.exports = {
"sequelize-pg-generator": {
"database": {
"host": "127.0.0.1",
"port": 5432,
"user": "user",
"password": "password",
"database": "",
"schema": ["public"]
},
"template": {
"engine": "swig",
"extension": "html",
"folder": path.join(__dirname, '..', 'template')
},
"output": {
"log": true,
"folder": "./model",
"beautify": true,
"indent": 4,
"preserveNewLines": false,
"warning": true
},
"generate": {
"stripFirstTableFromHasMany": true,
"addTableNameToManyToMany": false,
"addRelationNameToManyToMany": true,
"stripFirstTableNameFromManyToMany": true,
"hasManyThrough": false,
"belongsToMany": true,
"prefixForBelongsTo": "related",
"useSchemaName": true,
"modelCamelCase": true,
"relationAccessorCamelCase": true,
"columnAccessorCamelCase": true,
"columnDefault": false,
"columnDescription": true,
"columnAutoIncrement": true,
"tableDescription": true,
"dataTypeVariable": "Seq",
"skipTable": []
},
"tableOptions": {
"timestamps": false
}
}
};
Bu modül konfigürasyon için require('config') komutu ile config modülünü kullanır. Config modülü bu yazının yazıldığı sırada singleton yapısındaydı. Bu nedenle yapılan her çağrıya aynı nesneyi döndürüyordu. Sonuç olarak sonraki çağrılarda konfigürasyon dosyası değiştirilse ya da sequelize-pg-generator constructor çağrılırken başka bir konfigürasyon dosyası gösterilse bile ilk konfigürasyon dönüyor.
Normal kullanımda bu herhangi bir sorun teşkil etmez, çünkü sequelize-pg-generator aynı proses içinde genellikle sadece bir kere çağrılır. Ancak bu davranış test etmeyi engellemektedir. Kullanıcı da herhangi bir nedenle bu davranıştan kaçınmak isteyebilir. Bunu aşmak için, yan yol kullanan "resetConfig" isimli bir opsiyon eklenmiştir. Eğer bu seçenek true olarak ayarlanırsa konfigürasyon resetlenir ve yeniden okunur. Bunu yapabilmek için sequelize-pg-generator config modülünü node cache'den siler. lorenwest tarafından github hatalar bölümünde tavsiye edilen bu ara çözüm düşük verimde bir yöntemdir.
Bunu aktive etmek için resetConfig ayarını true olarak vermeniz veya cli'den çağırırken --resetConfig eklemeniz yeterlidir.
var generator = require('sequelize-pg-generator');
generator(function (err) {
if (err) { callback(err); }
}, {
database: 'my_database',
resetConfig: true
);
sequelize-pg-creator aşağıdaki kodu kullanır:
global.NODE_CONFIG = null;
delete require.cache[require.resolve('config')];
config = require('config');
Özel template'ler oluşturmak için kullanıcı varsayılan template dizinini kopyalayabilir veya sıfırdan kendisi oluşturarak "template.folder" konfigürasyon ayarını yeni kullanılacak olan dizini gösterecek şekilde ayarlar. 3 dosya gereklidir: index.ext (.ext kullandığınız template engine'in kullandığı dosya uzantısıdır), index.js, utils.js.
index.js ve utils.js dosyaları doğrudan hedef dizine kopyalanır. index.ext template ise model dosyalarını üretmek için her tablo için çağrılır.
Template içerisinde kullanılacak olan değişkenler ve açıklamaları aşağıda verilmiştir. Eğer bir değer tanımlanmamışsa (undefined ise), o değerin key'i üretilen dosyalara hiç yazılmayacaktır.
mainScript | Hedef dizinde üretilen index.js dosyasının patikası. |
warning | Bu değişken konfigürasyon içerisinde özelleştirme ile ilgili uyarı mesajının gösterilmesi ile ilgili ayarın ne olduğunu tutar. |
table | Tablo detaylarını, alanları ve ilişkileri vb. tutan nesne. |
table.modelName | Tablo için model ismi. |
table.tableName | Tablonun ismi. |
table.schema | Tablonun PostgreSQL şema (schema) ismi |
table.comment | Tablonun açıklaması. |
table.baseFileName | Dosya isminin base kısmı. |
SPECIAL | Konfigürasyon dosyasında Sequelize.define metoduna iletilmek için ayarlanan opsiyonlar da table nesnesi altında bulunur. Örneğin: table.timestamps |
table.columns | Tablonun alanlarını içeren dizi. |
table.columns[n].source | 'generator' yazısı. Bu nesne değerinin otomatik üretildiğini gösterir. Eğer kullanıcı modifiye edilen özellikleri bir döngü ile işlemek isterse vb. nedenlerle ayrım yapabilmesi için kullanılabilir. |
table.columns[n].type | Alanın Sequelize tipi. |
table.columns[n].accessorName | Alana erişmek için kullanılacak olan accessor metodunun ismi. |
table.columns[n].name | Alanın ismi. |
table.columns[n].primaryKey | Eğer bu alan birincil anahtarsa bu değer true olur. |
table.columns[n].autoIncrement | Eğer bu alan otomatik artırılan (auto increment) bir alansa bu değer true olur. |
table.columns[n].allowNull | Eğer bu alan NULL değerine izin veriyorsa bu değer true olur. |
table.columns[n].defaultValue | Alan için veri tabanındaki varsayılan değer. |
table.columns[n].unique | Alan bir unique anahtar ise veya kompozit bir unique anahtarın parçası ise unique anahtar ismini içeren değer. |
table.columns[n].comment | Alanın veri tabnındaki açıklaması. |
table.columns[n].references | Eğer bu alanın bir referansı varsa, bu değer alanın referans ettiği tablonun adını içerir. |
table.columns[n].referencesKey | Eğer bu alanın bir referansı varsa, bu değer alanın referans ettiği alanın adını içerir. |
table.columns[n].onUpdate | Alanın on update değeri. (SET NULL, CASCADE, RESTRICT etc.) |
table.columns[n].onDelete | Alanın on delete değeri. (SET NULL, CASCADE, RESTRICT etc.) |
table.hasManies | Tablonun hasMany ilişkilerini içeren dizi. |
table.hasManies[n].type | İlişkinin tipini gösteren 'hasMany' değeri. |
table.hasManies[n].source | 'generator' yazısı. Bu nesne değerinin otomatik üretildiğini gösterir. Eğer kullanıcı modifiye edilen özellikleri bir döngü ile işlemek isterse vb. nedenlerle ayrım yapabilmesi için kullanılabilir. |
table.hasManies[n].name | İlişkinin veri tabanındaki ismi. |
table.hasManies[n].model | Bu ilişkinin referans ettiği modelin ismi. |
table.hasManies[n].as | İlişki için alias ismi. Bu alias ismi Sequelize içerisinden bu ilişkiye erişmek için kullanılır. |
table.hasManies[n].targetSchema | İlişkinin referans ettiği PostgreSQL şemanın (schema) ismi. |
table.hasManies[n].targetTable | İlişkinin referans ettiği tablonun ismi. |
table.hasManies[n].foreignKey | İlişkinin referans ettiği tablodaki yabancı anahtar alanının ismi. |
table.hasManies[n].onDelete | Alanın on delete değeri. (SET NULL, CASCADE, RESTRICT etc.) |
table.hasManies[n].onUpdate | Alanın on update değeri. (SET NULL, CASCADE, RESTRICT etc.) |
table.hasManies[n].through | Eğer bu bir through (many to many) ilişki ise ara birleşim tablosunun ismi. Through ilişkiler Sequelize 2.0 RC4 itibari ile kaldırılacak (DEPRECATED) olarak işaretlendi. |
table.belongsTos | Tablonun belongsTo ilişkilerini içeren dizi. |
table.belongsTos[n].type | İlişkinin tipini gösteren 'belongsTo' değeri. |
table.belongsTos[n].source | 'generator' yazısı. Bu nesne değerinin otomatik üretildiğini gösterir. Eğer kullanıcı modifiye edilen özellikleri bir döngü ile işlemek isterse vb. nedenlerle ayrım yapabilmesi için kullanılabilir. |
table.belongsTos[n].name | İlişkinin veri tabanındaki ismi. |
table.belongsTos[n].model | Bu ilişkinin referans ettiği modelin ismi. |
table.belongsTos[n].as | İlişki için alias ismi. Bu alias ismi Sequelize içerisinden bu ilişkiye erişmek için kullanılır. |
table.belongsTos[n].targetSchema | İlişkinin referans ettiği PostgreSQL şemanın (schema) ismi. |
table.belongsTos[n].targetTable | İlişkinin referans ettiği tablonun ismi. |
table.belongsTos[n].foreignKey | Bu tablodaki bu ilişkiye ait olan yabancı anahtar alanının ismi. |
table.belongsTos[n].onDelete | Alanın on delete değeri. (SET NULL, CASCADE, RESTRICT etc.) |
table.belongsTos[n].onUpdate | Alanın on update değeri. (SET NULL, CASCADE, RESTRICT etc.) |
table.belongsToManies | Tablonun belongsToMany ilişkilerini içeren dizi. belongsToMany ilişkilleri Sequelize 2.0 RC4 ve sonraki versiyonlarda mevcuttur. |
table.belongsToManies[n].type | İlişkinin tipini gösteren 'belongsToMany' değeri. |
table.belongsToManies[n].source | 'generator' yazısı. Bu nesne değerinin otomatik üretildiğini gösterir. Eğer kullanıcı modifiye edilen özellikleri bir döngü ile işlemek isterse vb. nedenlerle ayrım yapabilmesi için kullanılabilir. |
table.belongsToManies[n].name | İlişkinin veri tabanındaki ismi. |
table.belongsToManies[n].model | Bu ilişkinin referans ettiği modelin ismi. |
table.belongsToManies[n].as | İlişki için alias ismi. Bu alias ismi Sequelize içerisinden bu ilişkiye erişmek için kullanılır. |
table.belongsToManies[n].targetSchema | İlişkinin referans ettiği PostgreSQL şemanın (schema) ismi. |
table.belongsToManies[n].targetTable | İlişkinin referans ettiği tablonun ismi. |
table.belongsToManies[n].foreignKey | Ara birleşim tablosundan bu tabloya referans veren yabancı anahtar alanının ismi. |
table.belongsToManies[n].otherKey | Ara birleşim tablosundan diğer hedef tabloya referans veren yabancı anahtar alanının ismi. |
table.belongsToManies[n].onDelete | Alanın on delete değeri. (SET NULL, CASCADE, RESTRICT etc.) |
table.belongsToManies[n].onUpdate | Alanın on update değeri. (SET NULL, CASCADE, RESTRICT etc.) |
table.belongsToManies[n].through | Ara birleşim tablosunun ismi. |
table.relations | Tüm türlerdeki ilişkilerin birleşik listesini içeren dizi. Bu dizi hasMany ilişkileri, hasMany through ilişkileri, belongsTo ilişkileri, belongsToMany ilişkilerinin hepsini içerir. |
sequelize-pg-generator ilişkileri "as" kullanarak isimlendirir. Aksi takdirde aynı tablolar arasında tanımlanacak olan birden fazla ilişki çakışır. Örneğin:
account has many contacts as primaryContacts (account -----< contact)
account has many contacts as secondaryContacts (account ----< contact)
Bu durumda sequelize.js "as" isminin eager loading sırasında "as" parametresi olarak verilmesini istiyor..
account = orm.model('public.account'); // Can be configured without schema.
contact = orm.model('public.contact'); // Can be configured without schema.
account.findAll({ include: [ { model: contact, as: "primaryContacts" } ] }).then(function(data) {
console.log(data[0].primaryContacts[0].name);
});