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).