Při použití dvou databází má druhá chybnou strukturu

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

Zdravím,
mám problém s použitím dvou databází v jedné aplikaci.

První má 9 tabulek, druhá má 1 tabulku. Pokud mají databáze ve skutečnosti stejnou strukturu, je čtení i zápis bez problémů, zapíše se vždy do databáze, do které potřebuji. Pokud však mají databáze jinou strukturu (můj případ), tak už s tím nelze pracovat. Např. výpis Nette\Database\Context ukazuje, že obě databáze mají sice jiné „connection“, ale úplně stejnou „structure“. To je chyba. Jak to opravit?

Problém je označen komentáři ke konci tohoto příspěvku.

config.development.neon

nette:
  database:
    default:
      dsn: "mysql:host=localhost;dbname=opera"
      user: root
      password:
      options:
        lazy: true
    backup:
      dsn: "mysql:host=localhost;dbname=opera_backup"
      user: root
      password:
      options:
        lazy: true

config.neon

  services:
    - App\Model\Database(@database.default)
    - App\Model\DatabaseBackup(@database.backup)

Model/Database.php resp. Model/DatabaseBackup.php

namespace App\Model;

use Nette;

class DatabaseBackup extends Nette\Object {
  private $connection;
  private $structure;
  private $conventions;
  private $cache;

  function __construct(Nette\Database\Connection $connection,
                       Nette\Database\IStructure $structure,
                       Nette\Database\IConventions $conventions,
                       Nette\Caching\IStorage $cache) {
    $this->connection = $connection;
    $this->structure = $structure;
    $this->conventions = $conventions;
    $this->cache = $cache;
  }

  function getContext() {
    return new Nette\Database\Context($this->connection, $this->structure, $this->conventions, $this->cache);
  }
}

Model/AccidentsFacade.php

namespace App\AccidentsModule\Model;

use Nette;

class AccidentsFacade extends Nette\Object {
  private $database;
  private $databaseBackup;

  function __construct(\App\Model\Database $database,
                       \App\Model\DatabaseBackup $databaseBackup) {
    $this->database = $database->getContext();
    $this->databaseBackup = $databaseBackup->getContext();
  }

  function getAll() {
    dump($this->database);
    dump($this->databaseBackup);

    return TRUE;
  }
}

výstup z dump($this->database)

Nette\Database\Context #303c
	connection private => Nette\Database\Connection #81ef
		onConnect => NULL
		onQuery => array (1)
		params private => array (3)
			0 => "mysql:host=localhost;dbname=opera" (35) ///// PRIPOJENI K PRVNI DB
			1 => "root" (4)
			2 => NULL
		options private => array (1)
		driver private => Nette\Database\Drivers\MySqlDriver #ca13
		preprocessor private => Nette\Database\SqlPreprocessor #93f7
		pdo private => PDO #7472
	structure private => Nette\Database\Structure #695d
		connection protected => Nette\Database\Connection #81ef
		cache protected => Nette\Caching\Cache #8563
		structure protected => array (5)  ///// POCET TABULEK PRVNI DB
			tables => array (9) [ ... ]
			columns => array (9) [ ... ]
			primary => array (9) [ ... ]
			belongsTo => array (6) [ ... ]
			hasMany => array (4) [ ... ]
		isRebuilt protected => FALSE
	conventions private => Nette\Database\Conventions\DiscoveredConventions #1a66
	cacheStorage private => Nette\Caching\Storages\FileStorage #4d72

výstup z dump($this->databaseBackup)

Nette\Database\Context #9e67
	connection private => Nette\Database\Connection #44af
		onConnect => NULL
		onQuery => array (1)
		params private => array (3)
			0 => "mysql:host=localhost;dbname=opera_backup" (40) ///// PRIPOJENI K DRUHE DB
			1 => "root" (4)
			2 => NULL
		options private => array (1)
		driver private => NULL
		preprocessor private => NULL
		pdo private => NULL
	structure private => Nette\Database\Structure #695d
		connection protected => Nette\Database\Connection #81ef
		cache protected => Nette\Caching\Cache #8563
		structure protected => array (5) ///// POCET TABULEK PRVNI DB!!!
			tables => array (9) [ ... ]
			columns => array (9) [ ... ]
			primary => array (9) [ ... ]
			belongsTo => array (6) [ ... ]
			hasMany => array (4) [ ... ]
		isRebuilt protected => FALSE
	conventions private => Nette\Database\Conventions\DiscoveredConventions #1a66
	cacheStorage private => Nette\Caching\Storages\FileStorage #4d72
David Matějka
Moderator | 6445
+
+1
-

Nechavas totiz ostatni parametry vcetne structure autowirovat. A autowiruje se to prvni. Proc si rovnou nevyzadas context pres @database.backup.context?

roman.campula
Člen | 60
+
0
-

Zajímavé, děkuji. Uvedený způsob jsem nepoužil, neboť jsem začátečník a můj způsob jsem po hodinách hledání shledal téměř funkčním.

Upraveno tedy na:
config.neon

services:
    - App\Model\Database(@database.default.context)
    - App\Model\DatabaseBackup(@database.backup.context)

Model/Database.php resp. Model/DatabaseBackup.php

namespace App\Model;

use Nette;

class DatabaseBackup extends Nette\Object {
  private $context;

  function __construct(Nette\Database\Context $context) {
    $this->context = $context;
  }

  function getContext() {
    return $this->context;
  }
}
temistokles
Člen | 8
+
0
-

David Matějka napsal(a):

Nechavas totiz ostatni parametry vcetne structure autowirovat. A autowiruje se to prvni. Proc si rovnou nevyzadas context pres @database.backup.context?

V prípade, že táto rada vám nepomohla a používate z nejakého dôvodu vlastný Context (pravdepodobná diagnóza môjho problému), nenechajte si autowirovať conventions a vygenerujte si ho vždy sami (ako Nette\Database\Conventions\DiscoveredConventions).