Bu modül yerine pg-generator modülünü kullanın. (Daha Yeni & İyi)
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
Açıklama
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.
Teşekkür
Bu modül Ozcorp desteği ile geliştirilmiştir.
Kullanım
Adım 1: npm -g komutu ile global olarak kurun.
Bu şekilde modülü ve CLI komutunu kurmuş olursunuz.
$ npm install -g sequelize-pg-generator
Adım 2: Model dosyalarını oluşturun.
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
Adım 3: Kendi node.js uygulamanızda modelleri kullanın
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 Kullanıcıları
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
CLI Seçenekleri
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.
UYARI: belongsToMany
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)
Özellikler
Üretilen Dosyalar Başka Modül Gerektirmez
Üretilen dosyalar çekirdek node modülleri ve Sequelize dışında herhangi bir modül gerektirmez.
Çoklu Şema (schema) Detseği
Ç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.
Şema Ön Eki Olmadan
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.
Tekten Çoğa (One To Many) İlişki Desteği
Bu modül otomatik olarak tekten çoğa ilişkileri tespit eder ve model.hasMany ve model.belongsTo sequelize ilişkilerini oluşturur.
Çoktan Çoğa (Many To Many) İlişki Desteği
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.
Şemalar Arası İlişki Desteği
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.
Yüksek Oranda Konfigüre 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.
Tamamaen Özelleştirilebilir
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.
CLI Desteği
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.
İlişki İsimlerini Kolayca Özelleştirebilirsiniz
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.
Model ve İlişkiler İçin Akıllı İsimlendirme
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.
Otomatik Üretilen Dosyalara Kolayca Müdahale
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.
Hariç Tutulan Tablolar
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.
Debug
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ı.
İsim çakışmalarını önler
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.
Tabloya Özel Konfigürasyon
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
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.
database |
||
| 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. |
template |
||
| 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. |
output |
||
| 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. |
generate |
||
| 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. |
tableOptionsKullanı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ı
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
}
}
};
DİKKAT: Konfigürasyonun Singleton Davranışı
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');
Template Değişkenleri (Template'leri Özelleştirme)
Ö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. |
Örnekler
Eager Loading
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);
});
API
Modules
Classes
lib/index
module.exports(callback, options) ⏏
Generates model files for Sequelize ORM.
Kind: Exported function
| Param | Type | Description |
|---|---|---|
| callback | function |
Function to execute after completion of auto generation. callback(err) |
| options | object |
Options to override configuration parameters from config file |
| options.host | string |
IP address or host name of the database server |
| options.port | number |
Port of database server to connect |
| options.database | string |
Database name |
| options.user | string |
Username to connect to database |
| options.password | string |
Password to connect to database |
| options.schema | Array |
List of comma separated names of the database schemas to traverse. Example public,extra_schema. |
| options.output | string |
Output folder |
| options.config | string |
Path of the configuration file |
| options.nolog | boolean |
Don't output log of generated files. |
| options.resetConfig | boolean |
Reset configuration via side-step solution to prevent singleton behaviour. (Not recomended for production) |
GeneratorUtil
Kind: global class
new GeneratorUtil(model)
| Param |
|---|
| model |
generatorUtil.getRelation(as) ⇒ Object
Searches and returns relation with the given alias. Alias is defined in sequelize options with parameter 'as'
Kind: instance method of GeneratorUtil
| Param | Type | Description |
|---|---|---|
| as | string |
Alias of the relation. |
generatorUtil.getAttribute(name) ⇒ Object
Searches and returns attribute with the given alias. Alias is defined in sequelize options with parameter 'as'
Kind: instance method of GeneratorUtil
| Param | Type | Description |
|---|---|---|
| name | string |
Name of the attribute. |
generatorUtil.renameAttribute(oldName, newName)
Searches and returns attribute with the given alias. Alias is defined in sequelize options with parameter 'as'
Kind: instance method of GeneratorUtil
Throws:
- Will throw error if there is already an attribute with new name exists or attribute with oldName does not exists.
| Param | Type | Description |
|---|---|---|
| oldName | string |
Name of the attribute which it's name to be changed. |
| newName | string |
New name of the attribute. |
History & Release Notes
Note
Version history for minimal documentation updates are not listed here to prevent cluttering.
0.9.0
- Added: sequelize-types are added. (pg-structure deprecated it.)
0.8.0 / 2015-10-14
- Added:
alias.jsonfile is generated in target directory to let developer easily override relationship names.
0.7.0 / 2015-10-14
- Changed: Location of utils.js is changed to inside of model directory.
0.6.0 / 2015-09-10
- -t --templateName parameter added to spgen. This name is used to choose one of the builtin template directories.
- sequalize4 template added for protect backward compatibility.
- sequalize4 template supports object references property. (references and referencesKey will be depreciated in Sequelize 4)
0.5.4 / 2015-06-16
- pg-structure updated to latest version.
0.5.3 / 2015-06-16
- Added: JSONB support and Boolean default value. Contributed by viniciuspinto (https://github.com/viniciuspinto)
0.4.2 / 2015-04-27
- Added documentation and examples.
0.3.1 / 2015-01-10
- Tested for Sequelize 2.0 RC7
0.3.0 / 2014-12-30
- Removed: pg-native dependency removed. Some users experienced problems during install.
- Added: generate.addRelationNameToManyToMany configuration to prefix relation aliases prevent further name clashes which cannot be prevented by generate.addTableNameToManyToMany. Default: true.
- Added: generate.stripFirstTableNameFromManyToMany configuration added. Default: true
- Changed: generate.addTableNameToManyToMany configuration default is false now.
- Changed: Default naming rule for many to many relations.
- Added: Logging uses Winston module now.
- Added: Doc update for Windows OS users.
- Fixed: Database tables without any column throws error when warning configuration is true.
0.2.0 / 2014-12-27
- Added: Automatic alias and naming validations to prevent name clash.
- Added: generate.addTableNameToManyToMany configuration to prefix relation aliases prevent name clash. Default: true.
- Added: --throwError option added to CLI. This option decides wheter to throw error or simply log.
- Added: Prevent hasMany through and belongsToMany true at the same time.
- Fixed: generate.prefixForBelongsTo aliases are not properly camel cased.
- Fixed: --resetConfig option does not work from CLI
- Doc update
0.1.17 / 2014-12-26
- Fixed: CLI command does not work.
- Added: Required parameters warning.
0.1.15 / 2014-12-26
- Added: Turkish documentation added.
- Fixed: Typos and mistakes in documents.
0.1.12 / 2014-12-23
- Added: Tests added.
- Added: --nolog option added to spgen command.
- Added: --resetConfig option. Also details and caveat added to the document.
- Fix: lib/index.js exported function expects different parameters than written in documentation.
- Fix: Command line arguments fixed.
- Fix: Data type variable name configuration is ignored.
- Document update.
0.1.0 / 2014-12-23
- Initial version.
The MIT License (MIT)
Copyright (c) 2014 Özüm Eldoğan
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.