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

- roman.campula
 - Člen | 60
 
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
 
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
 
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
 
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).