create account

Birden Fazla Veri Tabanı Kullanımı - ( Multi DB ) by hakancelik

View this thread on: hive.blogpeakd.comecency.com
· @hakancelik · (edited)
$0.49
Birden Fazla Veri Tabanı Kullanımı - ( Multi DB )
<center>

<a href="https://www.coogger.com/@hakancelik/birden-fazla-veri-taban-kullanm-multi-db">


  <img alt="Django multi db" src="https://cdn.steemitimages.com/DQmTxbMupXoHhMSTNk6ydzYgTEDCu83f5fGHVqNsgJxebDc">

</a>

<a href="https://www.coogger.com/@hakancelik/birden-fazla-veri-taban-kullanm-multi-db">Read this content on coogger</a>

</center>
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , and 51 others
properties (23)
authorhakancelik
permlinkbirden-fazla-veri-taban-kullanm-multi-db
categorycoogger
json_metadata"{"format": "markdown", "tags": ["coogger", "django", "multi", "db"], "app": "coogger/1.4.1", "ecosystem": {"version": "1.4.1", "body": "[TOC]\r\n\r\n<center>![Django multi db](https://cdn.steemitimages.com/DQmTxbMupXoHhMSTNk6ydzYgTEDCu83f5fGHVqNsgJxebDc)</center>\r\n\r\nBirden fazla veri taban\u0131 kullanmak i\u00e7in \u00f6ncelikle projemizin settings.py dosyas\u0131na eklemeler yaparak bu veri tabanlar\u0131n\u0131 tan\u0131mlamam\u0131z gerekiyor \u00f6rnek olarak a\u015fa\u011f\u0131da bir postgresql ve mysql veri tabanlar\u0131 i\u00e7in settings.py ayar\u0131 var birden fazla ve ayn\u0131 olmayan t\u00fcr olmayan veri tabanlar\u0131n\u0131da kullanabiliyoruz.\r\n\r\n```python\r\nDATABASES = {\r\n 'default': { # varsay\u0131lan olarak ayarlad\u0131\u011f\u0131m\u0131z ver taban\u0131m\u0131z\r\n 'NAME': 'app_data', # veri taban\u0131 ismi\r\n 'ENGINE': 'django.db.backends.postgresql', # veri taban\u0131 t\u00fcr\u00fc\r\n 'USER': 'postgres_user', # kullan\u0131c\u0131\r\n 'PASSWORD': 's3krit' # ve \u015fifre bunlar\u0131 yazma amac\u0131m\u0131z\u0131 bende bilmiyorum bilen varsa yoruma yazarsa d\u00fczeltme eklerim\r\n },\r\n 'users': { #sadece kullan\u0131clar\u0131 kay\u0131t etmek i\u00e7in a\u00e7m\u0131\u015f oldu\u011fumuz ( eri\u015fme ad\u0131 users olan user_data isimli )veri taban\u0131\r\n 'NAME': 'user_data',\r\n 'ENGINE': 'django.db.backends.mysql',\r\n 'USER': 'mysql_user',\r\n 'PASSWORD': 'priv4te'\r\n }\r\n}\r\n```\r\n\r\nTabiki varsay\u0131lan bir veri taban\u0131 kullanmak istemiyorsan\u0131z kullanmaya bilirsiniz bunun i\u00e7in default k\u0131sm\u0131n\u0131 bo\u015f b\u0131rakmal\u0131s\u0131n\u0131z \u015fu \u015fekilde ;\r\n\r\n```python\r\nDATABASES = {\r\n 'default': {},\r\n 'users': {\r\n 'NAME': 'user_data',\r\n 'ENGINE': 'django.db.backends.mysql',\r\n 'USER': 'mysql_user',\r\n 'PASSWORD': 'superS3cret'\r\n },\r\n 'customers': {\r\n 'NAME': 'customer_data',\r\n 'ENGINE': 'django.db.backends.mysql',\r\n 'USER': 'mysql_cust',\r\n 'PASSWORD': 'veryPriv@ate'\r\n }\r\n}\r\n```\r\n\r\n## Veritabanlar\u0131n\u0131z\u0131 Senkronize Etme\r\n\r\nVeri taban\u0131 senkronizasyonu komutu bir seferde bir veritaban\u0131 \u00fczerinde \u00e7al\u0131\u015f\u0131r. Varsay\u0131lan olarak, varsay\u0131lan veritaban\u0131 \u00fczerinde \u00e7al\u0131\u015f\u0131r, ancak \u2014database se\u00e7ene\u011fini sa\u011flayarak farkl\u0131 bir veritaban\u0131n\u0131 senkronize etmesini s\u00f6yleyebilirsiniz. Dolay\u0131s\u0131yla, yukar\u0131daki ilk \u00f6rnekteki t\u00fcm veritabanlar\u0131na t\u00fcm modelleri senkronize etmek i\u00e7in a\u015fa\u011f\u0131dakileri gibi yapman\u0131z gerekir.\r\n\r\n```python\r\n$ ./manage.py migrate # varsay\u0131lan olarak ayarlad\u0131\u011f\u0131n\u0131z veri taban\u0131 senkronize olur\r\n$ ./manage.py migrate --database=users # eri\u015fme ismi users olan veri taban\u0131 senkronize olur \r\n```\r\n\r\nBu da bir di\u011fer \u00f6rnek varsay\u0131lan\u0131 bo\u015f yapt\u0131\u011f\u0131m\u0131z i\u00e7in \r\n\r\n```\r\n$ ./manage.py migrate --database=users\r\n$ ./manage.py migrate --database=customers\r\n```\r\n\r\n## Di\u011fer Y\u00f6netim Komutlar\u0131n\u0131 Kullanma\r\n\r\nVeritaban\u0131 ile etkile\u015fim kuran di\u011fer \u00e7o\u011fu django-admin komutu, ta\u015f\u0131d\u0131k\u00e7a \u00e7al\u0131\u015f\u0131r; yaln\u0131zca bir defada yaln\u0131zca bir veritaban\u0131nda \u00e7al\u0131\u015f\u0131r; kullan\u0131lan veritaban\u0131 denetiminde \u2014database kullan\u0131l\u0131r.\r\n\r\nBu kural\u0131n bir istisnas\u0131 makemigrations komutudur. Yeni ge\u00e7i\u015fler olu\u015fturmadan \u00f6nce varolan ta\u015f\u0131ma dosyalar\u0131yla (bunlar\u0131 d\u00fczenlemeyle olu\u015fabilecek) sorunlar\u0131 yakalamak i\u00e7in veritabanlar\u0131ndaki ge\u00e7i\u015f ge\u00e7mi\u015fini do\u011frular. Varsay\u0131lan olarak, yaln\u0131zca varsay\u0131lan veritaban\u0131n\u0131 denetler, ancak varsa y\u00f6nlendiricilerin allow_migrate () y\u00f6ntemini inceler.\r\n\r\n## Otomatik Veritaban\u0131 Y\u00f6nlendirme ( Routing )\r\n\r\nBirden \u00e7ok veritaban\u0131n\u0131 kullanman\u0131n en kolay yolu, bir veritaban\u0131 y\u00f6nlendirme \u015femas\u0131 olu\u015fturmakt\u0131r. Varsay\u0131lan y\u00f6nlendirme \u015femas\u0131, nesnelerin orijinal veritaban\u0131na 'yap\u0131\u015fkan' kalmas\u0131n\u0131 sa\u011flar (yani, foo veritaban\u0131ndan al\u0131nan bir nesne ayn\u0131 veritaban\u0131na kaydedilir). Varsay\u0131lan y\u00f6nlendirme \u015femas\u0131, bir veritaban\u0131 belirtilmemi\u015fse, t\u00fcm sorgular varsay\u0131lan veritaban\u0131na geri d\u00f6nmesini sa\u011flar.\r\n\r\nVarsay\u0131lan y\u00f6nlendirme \u015femas\u0131n\u0131 etkinle\u015ftirmek i\u00e7in herhangi bir \u015fey yapmak zorunda de\u011filsiniz - her Django projesinde 'kutunun d\u0131\u015f\u0131nda' sa\u011flanmaktad\u0131r. Bununla birlikte, daha ilgin\u00e7 veritaban\u0131 tahsis davran\u0131\u015flar\u0131n\u0131 uygulamak isterseniz, kendi veritaban\u0131 y\u00f6nlendiricilerinizi tan\u0131mlayabilir ve kurabilirsiniz.\r\n\r\n### Veritaban\u0131 Y\u00f6nlendiricileri\r\n\r\nBir veri taban\u0131 Y\u00f6nlendirici, d\u00f6rt method sa\u011flayan bir s\u0131n\u0131ft\u0131r: Buralar teknik bilgi \u00e7ok tak\u0131lmay\u0131n daha a\u015fa\u011f\u0131da kodlarla \u00f6rneklenecektir daha iyi anlars\u0131n\u0131z\r\n\r\n#### db_for_read (model, **hints)\r\n> okuma i\u015flemleri i\u00e7in\r\n\r\nModel tipli nesneleri okuma i\u015flemleri i\u00e7in kullan\u0131lmas\u0131 gereken veritaban\u0131n\u0131 bildirin\r\n\r\nBir veritaban\u0131 i\u015flemi, bir veritaban\u0131n\u0131 se\u00e7mede yard\u0131mc\u0131 olabilecek herhangi bir ilave bilgi sa\u011flayabilirse, **hints** s\u00f6zl\u00fc\u011f\u00fcnde sa\u011flanacakt\u0131r. Ge\u00e7erli **hints** ile ilgili ayr\u0131nt\u0131lar a\u015fa\u011f\u0131da verilmi\u015ftir.\r\n\r\nHerhangi bir \u00f6neri yoksa **None** d\u00f6nd\u00fcr\u00fcr.\r\n\r\n#### db_for_write (model, **hints) \r\n> yazma i\u015flemleri i\u00e7in\r\n\r\nModel modelindeki nesnelerin yaz\u0131m\u0131nda kullan\u0131lmas\u0131 gereken veritaban\u0131n\u0131 bildirir3\r\n\r\nBir veritaban\u0131 i\u015flemi, bir veritaban\u0131n\u0131 se\u00e7mede yard\u0131mc\u0131 olabilecek herhangi bir ilave bilgi sa\u011flayabilirse, **hints** s\u00f6zl\u00fc\u011f\u00fcnde sa\u011flanacakt\u0131r. Ge\u00e7erli ipu\u00e7lar\u0131 ile ilgili ayr\u0131nt\u0131lar a\u015fa\u011f\u0131da verilmi\u015ftir.\r\n\r\nHerhangi bir \u00f6neri yoksa **None** d\u00f6nd\u00fcr\u00fcr.\r\n\r\n#### allow_relation (obj1, obj2, **hints) \r\n> veri taban\u0131ndaki nesne aras\u0131ndaki ili\u015fkiler i\u00e7in\r\n\r\n**Obj1** ve **obj2** aras\u0131ndaki bir ili\u015fkiye izin verilirse `True` de\u011ferini d\u00f6nd\u00fcr\u00fcr,\r\n\r\n\u0130li\u015fki \u00f6nlenmeli ise `False` d\u00f6nd\u00fcr\u00fcr, `None` ise se\u00e7ene\u011fi yoktur.\r\n\r\nBu yanl\u0131zca bir do\u011frulama i\u015flemi dir, **foreign** key ve **many to many** \u0130ki nesne aras\u0131nda bir ili\u015fki olup olmad\u0131\u011f\u0131n\u0131n belirlenmesi sa\u011flar.\r\n\r\n#### allow_migrate(db, app_label, model_name=None, **hints) \r\n> ( migrate ) ta\u015f\u0131ma i\u015flemleri i\u00e7in\r\n\r\nGe\u00e7i\u015f i\u015fleminin, takma ad ( db ) veritaban\u0131 ile veritaban\u0131nda \u00e7al\u0131\u015fmas\u0131na izin verilip verilmeyece\u011fini belirler. \u0130\u015flemi \u00e7al\u0131\u015ft\u0131rmas\u0131 gerekiyorsa `True`, aksi halde \u00e7al\u0131\u015fmamas\u0131 durumunda `False` veya y\u00f6nlendiricinin ( router ) fikri yoksa `None` d\u00f6nd\u00fcr\u00fcr.\r\n\r\n**app_label** konumsal arg\u00fcman\u0131, ta\u015f\u0131nan ( migrated yap\u0131lan ) uygulaman\u0131n etiketidir.\r\n\r\n> modelname \u00e7o\u011fu ta\u015f\u0131ma ( migrations ) i\u015flemi taraf\u0131ndan ta\u015f\u0131nan modelin model._meta.model_name (model_name 'in k\u00fc\u00e7\u00fck harfli versiyonu) de\u011ferine ayarlan\u0131r .\r\n\r\n\u0130pu\u00e7lar\u0131n\u0131 ( hints ) kullanmad\u0131\u011f\u0131 s\u00fcrece, **RunPython** ve **RunSQL** i\u015flemleri i\u00e7in `None` de\u011ferini d\u00f6nd\u00fcr\u00fcr.\r\n\r\nipu\u00e7lar\u0131 ( hints ) y\u00f6nlendiriciye ek bilgi iletmek i\u00e7in baz\u0131 i\u015flemler taraf\u0131ndan kullan\u0131l\u0131r.\r\n\r\nModel_name ayarl\u0131 oldu\u011funda, ipu\u00e7lar\u0131 normalde 'model' anahtar\u0131n\u0131n alt\u0131ndaki model s\u0131n\u0131f\u0131n\u0131 i\u00e7erir. Tarihsel bir model olabilece\u011fini ve bu nedenle herhangi bir \u00f6zel nitelik, y\u00f6ntem veya y\u00f6neticinin olmad\u0131\u011f\u0131n\u0131 unutmay\u0131n. Sadece _meta'ya g\u00fcvenmelisin.\r\n\r\nBu y\u00f6ntem, belirli bir veritaban\u0131nda bir modelin kullan\u0131labilirli\u011fini belirlemek i\u00e7in de kullan\u0131labilir.\r\n\r\n`makemigrations` her zaman model de\u011fi\u015fiklikleri i\u00e7in ge\u00e7i\u015fler olu\u015fturur, ancak `allow_migrate()` yanl\u0131\u015f d\u00f6nd\u00fcr\u00fcrse, db i\u00e7in ge\u00e7i\u015f i\u015flemi ger\u00e7ekle\u015ftirilirken model_name i\u00e7in yap\u0131lan t\u00fcm ta\u015f\u0131ma i\u015flemleri sessizce atlan\u0131r. Zaten ge\u00e7i\u015f g\u00f6t\u00fcren modeller i\u00e7in `allow_migrate()` i\u015flevinin de\u011fi\u015ftirilmesi, yabanc\u0131 anahtarlar\u0131n, ek tablolar\u0131n veya eksik tablolar\u0131n kopmas\u0131na neden olabilir. Makemigrations, ge\u00e7i\u015f ge\u00e7mi\u015fini do\u011frulad\u0131\u011f\u0131nda hi\u00e7bir uygulaman\u0131n ge\u00e7i\u015f yapmas\u0131na izin verilmeyen veritabanlar\u0131n\u0131 atlar.\r\n\r\nY\u00f6nelticinin t\u00fcm bu y\u00f6ntemleri sunmas\u0131 gerekmez - bir veya daha fazlas\u0131n\u0131 atlayabilir. Y\u00f6ntemlerden biri atlan\u0131rsa, Django ilgili denetimi yaparken bu y\u00f6nlendirici atlayacakt\u0131r.\r\n\r\n#### Hints ( \u0130pu\u00e7lar)\r\n\r\nVeritaban\u0131 y\u00f6nlendiricisi taraf\u0131ndan al\u0131nan ipu\u00e7lar\u0131, hangi veritaban\u0131n\u0131n belirli bir iste\u011fi almas\u0131 gerekti\u011fine karar vermek i\u00e7in kullan\u0131labilir.\r\n\r\n\u015eu anda, sa\u011flanacak tek ipucu, y\u00fcr\u00fct\u00fclmekte olan okuma veya yazma i\u015flemi ile ili\u015fkili bir nesne \u00f6rne\u011fi. Bu kaydedilen \u00f6rnek olabilir veya \u00e7oktan \u00e7oklu ili\u015fkide eklenen bir \u00f6rnek olabilir. Baz\u0131 durumlarda hi\u00e7bir \u00f6rnek ipucu verilmez. Y\u00f6neltici bir \u00f6rnek ipucu varl\u0131\u011f\u0131n\u0131 denetler ve bu ipucunun y\u00f6nlendirme davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek i\u00e7in kullan\u0131l\u0131p kullan\u0131lmayaca\u011f\u0131n\u0131 belirler.\r\n\r\n### Y\u00f6nlendiricileri Kullanma\r\n\r\nVeritaban\u0131 y\u00f6nlendiricileri, `DATABASE_ROUTERS` ayar\u0131 kullan\u0131larak y\u00fcklenir **settings.py** de ayarlanmas\u0131 gerekir. Bu ayar, her biri ana y\u00f6nlendirici `(django.db.router)` taraf\u0131ndan kullan\u0131lmak \u00fczere bir y\u00f6nlendirici belirterek s\u0131n\u0131f adlar\u0131n\u0131n bir listesini tan\u0131mlar.\r\n\r\nAna y\u00f6nlendirici, veritaban\u0131 kullan\u0131m\u0131n\u0131 tahsis etmek i\u00e7in Django'nun veritaban\u0131 i\u015flemleri taraf\u0131ndan kullan\u0131l\u0131r. Bir sorgu hangi veritaban\u0131n\u0131 kullanaca\u011f\u0131n\u0131 bilmeye ihtiya\u00e7 duydu\u011funda, bir model ve bir ipucu (varsa) sa\u011flayarak ana y\u00f6nlendirici \u00e7a\u011f\u0131r\u0131r. Django, daha sonra bir veritaban\u0131 \u00f6nerisi bulunana kadar her y\u00f6nlendiriciyi dener. Hi\u00e7bir \u00f6neri bulunamazsa, ipucu \u00f6rne\u011finin ge\u00e7erli _state.db dosyas\u0131n\u0131 dener. Bir ipucu \u00f6rne\u011fi sa\u011flanmazsa veya \u00f6rnek \u015fu anda veritaban\u0131 durumuna sahip de\u011filse, ana y\u00f6nlendirici varsay\u0131lan veritaban\u0131n\u0131 tahsis edecektir.\r\n\r\n#### Settings.py\r\n\r\n`DATABASE_ROUTERS = [] # \u015feklinde olmal\u0131`\r\n\r\n\u00d6rnek verelim ve bu \u00f6rne\u011fin veri taban\u0131 ayarlar\u0131 nas\u0131l olacak bakal\u0131m;\r\n\r\n```python\r\nDATABASES = {\r\n 'default': {}, # varsay\u0131lan bir veri taban\u0131 kullanm\u0131yoruz bu y\u00fczden bo\u015f\r\n 'auth_db': {\r\n 'NAME': 'auth_db',\r\n 'ENGINE': 'django.db.backends.mysql',\r\n 'USER': 'mysql_user',\r\n 'PASSWORD': 'swordfish',\r\n },\r\n 'primary': {\r\n 'NAME': 'primary',\r\n 'ENGINE': 'django.db.backends.mysql',\r\n 'USER': 'mysql_user',\r\n 'PASSWORD': 'spam',\r\n },\r\n 'replica1': {\r\n 'NAME': 'replica1',\r\n 'ENGINE': 'django.db.backends.mysql',\r\n 'USER': 'mysql_user',\r\n 'PASSWORD': 'eggs',\r\n },\r\n 'replica2': {\r\n 'NAME': 'replica2',\r\n 'ENGINE': 'django.db.backends.mysql',\r\n 'USER': 'mysql_user',\r\n 'PASSWORD': 'bacon',\r\n },\r\n}\r\n```\r\n\r\n\u015eimdi rota ayarlamam\u0131z gerekiyor. \u0130lk \u00f6nce, auth uygulamas\u0131 i\u00e7in sorgular g\u00f6nderilmesini bilen bir router'\u0131 **auth_db** i\u00e7in ayarlayaca\u011f\u0131z.\r\n\r\n```python\r\nclass AuthRouter(object): \r\n# AuthRouter isminde sadece auth_db kullanma ismini verdi\u011fimiz veri taban\u0131 rauterini ayarlayaca\u011f\u0131z\r\n# yani sadece auth_db isimli veri taban\u0131 i\u00e7indir bu\r\n \"\"\"\r\n T\u00fcm veritaban\u0131 i\u015flemlerini kontrol eden y\u00f6nlendirici\r\n kimlik do\u011frulama uygulamas\u0131n\u0131n modeldir.\r\n \"\"\"\r\n def db_for_read(self, model, **hints):\r\n \"\"\"\r\n auth_db'ye giden yetkili modelleri (auth models) Okumaya \u00e7al\u0131\u015f\u0131r.\r\n \"\"\"\r\n if model._meta.app_label == 'auth':\r\n return 'auth_db'\r\n return None\r\n def db_for_write(self, model, **hints):\r\n \"\"\"\r\n Attempts to write auth models go to auth_db.\r\n \"\"\"\r\n if model._meta.app_label == 'auth':\r\n return 'auth_db'\r\n return None\r\n def allow_relation(self, obj1, obj2, **hints):\r\n \"\"\"\r\n Yetkilendirme uygulamas\u0131ndaki bir model dahil edilirse ili\u015fkilere izin ver.\r\n iki nesne de auth a ait ise ili\u015fkiye izin veriyor\r\n \"\"\"\r\n if obj1._meta.app_label == 'auth' or \\ \r\n obj2._meta.app_label == 'auth':\r\n return True\r\n return None\r\n def allow_migrate(self, db, app_label, model_name=None, **hints):\r\n \"\"\"\r\n Auth uygulamas\u0131n\u0131n yaln\u0131zca 'auth_db' veritaban\u0131nda g\u00f6r\u00fcnd\u00fc\u011f\u00fcnden emin olun.\r\n \"\"\"\r\n if app_label == 'auth':\r\n return db == 'auth_db'\r\n return None\r\n```\r\n\r\nAyr\u0131ca di\u011fer t\u00fcm uygulamalar\u0131 birincil / \u00e7o\u011faltma yap\u0131land\u0131rmas\u0131na g\u00f6nderen bir y\u00f6nlendirici istiyoruz ve a\u015fa\u011f\u0131dakileri okumak i\u00e7in rasgele bir kopya se\u00e7iyor:\r\n\r\n```python\r\nimport random\r\nclass PrimaryReplicaRouter(object):\r\n def db_for_read(self, model, **hints):\r\n \"\"\"\r\n Okumalar, rasgele se\u00e7ilen kopyaya gidiyor.\r\n \"\"\"\r\n return random.choice(['replica1', 'replica2'])\r\n def db_for_write(self, model, **hints):\r\n \"\"\"\r\n Yazmak i\u00e7in daima primary'w gidiyor.\r\n \"\"\"\r\n return 'primary'\r\n def allow_relation(self, obj1, obj2, **hints):\r\n \"\"\"\r\n Her iki nesne primary/replica havuzunda bulunuyorsa, \r\n nesneler aras\u0131ndaki ili\u015fkilere izin verilir.\r\n \"\"\"\r\n db_list = ('primary', 'replica1', 'replica2')\r\n if obj1._state.db in db_list and obj2._state.db in db_list:\r\n return True\r\n return None\r\n def allow_migrate(self, db, app_label, model_name=None, **hints):\r\n \"\"\"\r\n T\u00fcm auth olmayan modeller bu havuza girer.\r\n \"\"\"\r\n return True\r\n```\r\n\r\nDi\u011fer veri tabanlar\u0131n\u0131 i\u00e7inde rauter tan\u0131mlad\u0131\u011f\u0131m\u0131za g\u00f6re son olarak, ayarlar dosyas\u0131nda a\u015fa\u011f\u0131dakileri ekliyebiliriz (y\u00f6nlendiricilerin tan\u0131mland\u0131\u011f\u0131 mod\u00fcllere / noktalara ger\u00e7ek Python yolunu de\u011fi\u015ftirerek):\r\n\r\n```python\r\nDATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.PrimaryReplicaRouter']\r\n```\r\n\r\ns\u0131n\u0131f isimlerini veriyoruz buras\u0131 \u00f6nem li \u00e7\u00fcnk\u00fc yanl\u0131\u015f girerseniz django s\u0131n\u0131f yolunu bulamaz (y\u00f6nlendiricilerin tan\u0131mland\u0131\u011f\u0131 mod\u00fcllere / noktalara ger\u00e7ek Python yolunu de\u011fi\u015ftirerek)yaz\u0131n\r\n\r\n## Veritaban\u0131 El \u0130le Se\u00e7me\r\n\r\nDjango, kodunuzda veritaban\u0131 kullan\u0131m\u0131 \u00fczerinde tam kontrol sahibi olman\u0131z\u0131 sa\u011flayan bir API de sa\u011flar. Elle belirlenen bir veritaban\u0131 tahsisi, bir y\u00f6nlendirici taraf\u0131ndan ayr\u0131lan bir veritaban\u0131na g\u00f6re \u00f6ncelik ta\u015f\u0131r.\r\n\r\n### Bir QuerySet \u0130\u00e7in Bir Veritaban\u0131 El \u0130le Se\u00e7me\r\n\r\nBunun i\u00e7in `using()` fonksiyonunu kullanca\u011f\u0131z, \u00f6rnek olarak\r\n\r\n```python\r\n>>> # bu kod varsay\u0131lan olarak ayarlad\u0131\u011f\u0131n\u0131z veri taban\u0131ndan nesne \u00e7eker\r\n>>> Author.objects.all()\r\n>>> # ve bu\r\n>>> Author.objects.using('default').all()\r\n>>> # ama bu other olarak ayarlanan veri taban\u0131ndan veri \u00e7eker\r\n>>> Author.objects.using('other').all()\r\n```\r\n\r\nveri tabanlar\u0131na yeni veriyi kay\u0131t etmek i\u00e7inde using() kullan\u0131l\u0131r \u00f6rnek\r\n\r\n```python\r\nmy_object.save(using='legacy_users')\r\n# bu kod ald\u0131\u011f\u0131 veriyi \"legacy_users\" adl\u0131 veri taban\u0131na kay\u0131t eder\r\n```\r\n\r\nsilme i\u015flemi i\u00e7in yine ayn\u0131\r\n\r\n```python\r\nu = User.objects.using('legacy_users').get(username='fred')\r\nu.delete() # `legacy_users` veri taban\u0131ndaki veriyi siler\r\n```\r\n\r\n## Birden Fazla Veri Taban\u0131 \u0130\u00e7in Admin Aray\u00fcz\u00fc Ayar\u0131\r\n\r\n```python\r\nclass MultiDBModelAdmin(admin.ModelAdmin):\r\n # Alternatif veritaban\u0131 ad\u0131 i\u00e7in kullan\u0131\u015fl\u0131 bir sabit.\r\n using = 'other' # kullan\u0131lacak olan veri taban\u0131 ismi\r\n def save_model(self, request, obj, form, change):\r\n # django ya kay\u0131t yap\u0131lacak nesne veri taban\u0131n\u0131n 'other' oldu\u011funu s\u00f6yler\r\n obj.save(using=self.using)\r\n def delete_model(self, request, obj):\r\n #djangoya silme i\u015flemi i\u00e7in 'other' veri taban\u0131 oldu\u011funu s\u00f6yler\r\n obj.delete(using=self.using)\r\n def get_queryset(self, request):\r\n #Django'ya 'di\u011fer' veritaban\u0131ndaki nesneleri aramas\u0131n\u0131 s\u00f6yler.\r\n return super(MultiDBModelAdmin, self).get_queryset(request).using(self.using)\r\n def formfield_for_foreignkey(self, db_field, request, **kwargs):\r\n # Django'ya bir Sorgu kullanarak ForeignKey widget'lerini yerle\u015ftirmesini s\u00f6yler\r\n # 'other' veri taban\u0131nda tabikide\r\n return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request, using=self.using, **kwargs)\r\n def formfield_for_manytomany(self, db_field, request, **kwargs):\r\n #Django'ya, 'other' veritaban\u0131nda bir sorgu kullanarak ManyToMany\r\n # widget'lerini doldurmas\u0131n\u0131 s\u00f6yle.\r\n return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request, using=self.using, **kwargs)\r\n```\r\n\r\n```python\r\nclass MultiDBTabularInline(admin.TabularInline):\r\n using = 'other'\r\n def get_queryset(self, request):\r\n # Django'ya 'other' veritaban\u0131ndaki sat\u0131ri\u00e7i nesneleri aramas\u0131n\u0131 s\u00f6yle.\r\n return super(MultiDBTabularInline, self).get_queryset(request).using(self.using)\r\n def formfield_for_foreignkey(self, db_field, request, **kwargs):\r\n # Django'ya, 'other' veritaban\u0131nda bir sorgu kullanarak \r\n # ForeignKey widget'lerini yerle\u015ftirmesini s\u00f6yle.\r\n return super(MultiDBTabularInline, self).formfield_for_foreignkey(db_field, request, using=self.using, **kwargs)\r\n def formfield_for_manytomany(self, db_field, request, **kwargs):\r\n # Django'ya, \"other\" veritaban\u0131nda bir sorgu kullanarak \r\n # ManyToMany widget'lerini doldurmas\u0131n\u0131 s\u00f6yle.\r\n return super(MultiDBTabularInline, self).formfield_for_manytomany(db_field, request, using=self.using, **kwargs)\r\n```\r\n\r\nyine admin py de yapt\u0131\u011f\u0131m\u0131z s\u0131n\u0131flar\u0131 register ile yolluyoruz\r\n\r\n```python\r\nfrom django.contrib import admin\r\n# Belirli modellerle kullanmak i\u00e7in multi-db admin nesnelerini \u00f6zelle\u015ftirme\r\nclass BookInline(MultiDBTabularInline):\r\n model = Book\r\nclass PublisherAdmin(MultiDBModelAdmin):\r\n inlines = [BookInline]\r\nadmin.site.register(Author, MultiDBModelAdmin)\r\nadmin.site.register(Publisher, PublisherAdmin)\r\nothersite = admin.AdminSite('othersite')\r\nothersite.register(Publisher, MultiDBModelAdmin)\r\n```\r\n\r\n## [Source](https://docs.djangoproject.com/en/1.11/topics/db/multi-db/)"}}"
created2019-02-18 21:12:36
last_update2019-02-25 18:14:24
depth0
children0
last_payout2019-02-25 21:12:36
cashout_time1969-12-31 23:59:59
total_payout_value0.386 HBD
curator_payout_value0.107 HBD
pending_payout_value0.000 HBD
promoted0.000 HBD
body_length352
author_reputation15,102,487,166,852
root_title"Birden Fazla Veri Tabanı Kullanımı - ( Multi DB )"
beneficiaries[]
max_accepted_payout1,000,000.000 HBD
percent_hbd10,000
post_id80,063,960
net_rshares990,181,066,137
author_curate_reward""
vote details (115)