připojení do dvou databází na dvou serverech.. (popř. tří..)
- Altimit
- Člen | 82
Dobrý den, mám problém..
možná se to tu už určitě řešilo..
koukla jsem na ty odpovědi ohledně toho, ale nepochápal jsem to..
Jedná se o připojení do db.. ale do dvou na dvou různých místech
s různými ip.
v config.ini mám toto:
nette:
database:
default:
dsn: "mysql:host=localhost;dbname=web"
user: root
password: heslíčko
db2:
dsn: "mysql:host=externaldbip;dbname=server"
user: root
password: heslíčko
services:
- default(@nette.database.default)
- Db2(@nette.database.db2)
ale když to chci hodit na ten web tak mi to hází chybu.. s modely
neumím.. a tak bych potřeboval poradit.. Díky mnohokrát.
nemůže to být na jedné, protože daný server komunikuje s db a to musí
mít na localhostu, tak aby se nelagoval server..
- Altimit
- Člen | 82
v exception.log je:
[2015-12-09 19-23-35] Nette\InvalidArgumentException: Table 'rules' does not exist. in /var/betamineworld/vendor/nette/database/src/Database/Structure.php:249 @ http://vps2.altimut.eu/www/rules/ @@ exception--2015-12-09--19-23--b533607250.html
[2015-12-09 19-23-45] Fatal Error: Call to a member function table() on a non-object in /var/betamineworld/app/presenters/ServerPresenter.php:15 @ http://vps2.altimut.eu/www/server/money @@ exception--2015-12-09--19-23--333c21909b.html
a v načtení exceptionu s koncovkou .html je:
Call to a member function table() on a non-object
- CZechBoY
- Člen | 3608
Potřebuješ tam dostat context :-)
nette:
database:
default:
dsn: "mysql:host=localhost;dbname=web"
user: root
password: heslíčko
db2:
dsn: "mysql:host=externaldbip;dbname=server"
user: root
password: heslíčko
services:
- default(@nette.database.default.context)
- Db2(@nette.database.db2.context)
- Altimit
- Člen | 82
teď to pro změnu píše toto..:
[2015-12-09 19-23-46] Nette\DI\ServiceCreationException: Class db2 used in service '30_db2' not found or is not instantiable. in /var/betamineworld/vendor/nette/di/src/DI/ContainerBuilder.php:476 @ http://vps2.altimut.eu/www/ @@ exception--2015-12-09--19-23--3cb811b264.html
nevím kde se tam vzalo v erroru těch 30_
- Altimit
- Člen | 82
takže to budu muset celé předělat.. ale udělám to tedy přes modely
(aspoň se je trochu naučím)
jak to tedy udělám aby určitý model volal určitou db (dejme tomu, že vše
co je v presenteru ServerPresenter.php bude volat db s parametry, které jsou
na herním serveru a ostatní Presentery budou volat druhou lokální db)??
koukal jsem teď na net a našel jsem toto:
services:
authenticator: Authenticator
- Model\Default(Nette\Database\Context(@database.default.context))
- Model\Serverdata(Nette\Database\Context(@database.serverdb.context))
- App\RouterFactory
router: @App\RouterFactory::createRouter
a config.local.neon
database:
default:
dsn: 'mysql:host=127.0.0.1;dbname=web'
user: root
password: **heslicko**
serverdb:
dsn: 'mysql:host=serverip;dbname=server'
user root
password: **heslicko**
a v Model\Serverdata.php bych tedy měl mít něco takového:
namespace Model;
use Nette\Database\Context;
use Nette;
use Nette\Utils\Validators;
use Nette\Utils\Strings;
class Serverdata extends Nette\Object {
private $database_serverdb;
public function __construct(Nette\Database\Context $database_serverdb {
....
}
}
Mohlo by toto fungovat? přičemž bude v class serverdata volání do db a příkaz pro výpis z db (data)
Editoval Altimit (11. 12. 2015 10:56)
- CZechBoY
- Člen | 3608
No jasne, vlastně úplně to stejný, co jsme do ted řešili.
Jen musíš dát ty tvoje modely do spravnyho namespacu.
Edit: Koukám, že v konfiguraku tam je navíc ještě uvedena cela třída Db Context. To nevím co dělá, ale držel bych se toho, že v parametru služby (modelu) budeš mít jen ten @database.default.context
Editoval CZechBoY (11. 12. 2015 11:38)
- David Matějka
- Moderator | 6445
- Model\Serverdata(Nette\Database\Context(@database.serverdb.context))
je spatne, ma to byt jen
- Model\Serverdata(@database.serverdb.context)