README-TR.md 47.7 KB

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:

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.

tableOptions

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ı

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

lib/index

Classes

GeneratorUtil

lib/index

Author: Özüm Eldoğan

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