Aplikace pracující nad vícero databázemi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
thunderbuff
Člen | 164
+
0
-

Vytvářím aplikaci, která bude pracovat ve více instancích, každá se svou databází. Všechny instance běží na jednom kódu, pouze se načítá jiný neon soubor (na základě url). Při některých operacích v libovolné z instancí budu potřebovat přístup k databázím ostatních instancí. Jak to efektivně udělat? Viděl bych to na čachry s nenonem, ale neumím v tom chodit. Budu vděčný za každou radu.

Editoval thunderbuff (31. 8. 2012 14:16)

bazo
Člen | 620
+
0
-

ja by som spravil jeden neon so zoznamom vsetkych pripojeni, ktory by pouzivali vsetky instancie, a podla url by sa vyberalo spravne pripojenie. takto by si mohol pracovat aj s ostatnymi db.

configov mozes mat kolko chces.

thunderbuff
Člen | 164
+
0
-

Touto cestou se pokouším jít. Plyne z toho jeden zádrhel: Je možné nějak automaticky určit, ke které databázi se připojit? V každé instanci mám se mi v indexu definuje konstanta APP_INSTANCE. Lze to nějak využít, nebo musím mín konfigurace jednotlivých instancí natvrdo nastavené na správnou databázi?

Pipaslot
Člen | 19
+
0
-

Řešil jsem problém, kdy po přihlášení do systému (ověření ve výchozí databázi) se má vybrat klientská databáze, se kterou pracují moje Modely a téměř veškerý běh aplikace je nad klientskou databází. Vytvořil jsem si abstrkaktní třídu UserDb, která z objektu User, získá název databáze a připojí ji. Poté všechny modely pracující pod databázi uživatele dědí userDb.

<?php

abstract class UserDb extends Nette\Object
{
	protected $NetteDb, $NetteUser, $NetteContainer;
// User database connection
	protected $db;
// Informace for connection into database
	protected $dbName;

	function __construct(\Nette\Database\Connection $wedb, \Nette\Security\User $user, \Nette\DI\IContainer $container)
	{
		$this->NetteDb = $wedb;
		$this->NetteUser = $user;
		$this->NetteContainer = $container;

		$this->dbName = $user->getIdentity()->database;

		//Předání řízení databáze uživatelské databázi
		if($this->db === null)
		{
			$this->db = new Nette\Database\Connection(
							$container->parameters['database']['driver'].':host='.$container->parameters['database']['host'].';dbname='.$this->dbName,
							$container->parameters['database']["user"],
							$container->parameters['database']["password"]);
			//Přidání databáze do Nette panelu laděnky
			$service = new Nette\Database\Diagnostics\ConnectionPanel;
			$service->explain = FALSE;
			Nette\Diagnostics\Debugger::$bar->addPanel($service);
			$this->db->onQuery[] = array($service, 'logQuery');
		}
	}
...
}

Práce s databází u potomků se pak odehrává nad objektem $this->db

Editoval Pipaslot (15. 9. 2012 22:45)