Jak skamarádit Nette a Oracle DB?
- pesMamlas
- Člen | 8
Zdravím
na localu mám databázi v MySQL a projekt v PHP v5.6. Pro přístup do databáze jsem vyzkoušel Nette/Database/Connection a dále DIBI. Obojí funguje jak má a není žádný problém. Nyní bych chtěl projekt převést na server, který jede na stejné verzi PHP, ALE databáze je Oracle.
V případě připojení přes Nette/Database/Connection, se v Tracy zobrazí testovací QUERY (SELECT * FROM foo) s 0 výsledků (to je špatně). Při pokusu o zobrazení neexistujícího sloupce Tracy vyhodí chybu. Tím jsem si jist, že komunikace funguje, jen nevypisuje výsledky (rows).
Horší to je v případě DIBI, kdy se při pokusu o načtení dat z DB načítá stránka a nakonec vyhodí chybu 500 bez Tracy.
Připojení incializuji přes construktor:
function __construct(\Dibi\Connection $database) {
$this->database = $database;
}
Zde je nastaveni config v případě dibi na locale:
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
dibi:
driver: mysql
port: 1521
database: foo
username: 'root'
password:
lazy: TRUE
Věděl by někdo v čem může být zakopaný pes?
Díky moc
Editoval pesMamlas (6. 10. 2020 7:45)
- Pavel Kravčík
- Člen | 1194
Ahoj, my jedeme bez DIBI nějak takhle:
dsn: 'oci:dbname=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = XXXXX)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = XXX) (SID = ORCL)));charset=UTF8'
- pesMamlas
- Člen | 8
Pavel Kravčík napsal(a):
Ahoj, my jedeme bez DIBI nějak takhle:
dsn: 'oci:dbname=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = XXXXX)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = XXX) (SID = ORCL)));charset=UTF8'
Ahoj,
takhle jsem to rozjel na produkčním serveru bez DIBI.
V Tracy se objeví připojení i ta jedna query, kterou to
chci otestovat, ale výsledek je 0 rows, i když v tabulce
databáze je záznamů 20. Když jsem to rozjížděl bez Nette, tak mi
oci_connect výsledek vyhodil jak měl.
Vůbec mě nenapadá, jaké může být omezení, že to s DB komunikuje (hlídá to názvy sloupců), ale data to nevyhodí žádná.
V presenteru fetchuju data takto přes fetch/fetchAll/query (query jako v Tracy ok, data žádná):
$this->template->foo = $this->database->fetchAll("SELECT * FROM foo");
Editoval pesMamlas (6. 10. 2020 9:20)
- Zdeno1981
- Člen | 115
Ahoj,
používám Oracle Database jak na Nette Database (bez Explorer) tak na dibi, obě fungují.
Pokud nemáš nakonfigurované tnsnames.ora, můžeš udělat konfiguraci nějak takto:
Nette Database:
database:
dsn: 'oci:dbname=(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.0)(PORT = 1521)))(CONNECT_DATA=(SID=name))'
user:
password:
options:
lazy: yes
dibi:
dibi:
driver: oracle
username:
password:
database: '(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.0)(PORT = 1521)))(CONNECT_DATA=(SID=name)))'
lazy: true
charset: utf8
- pesMamlas
- Člen | 8
Zdeno1981 napsal(a):
Ahoj,
používám Oracle Database jak na Nette Database (bez Explorer) tak na dibi, obě fungují.
Pokud nemáš nakonfigurované tnsnames.ora, můžeš udělat konfiguraci nějak takto:
Nette Database:
database: dsn: 'oci:dbname=(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.0)(PORT = 1521)))(CONNECT_DATA=(SID=name))' user: password: options: lazy: yes
dibi:
dibi: driver: oracle username: password: database: '(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.0)(PORT = 1521)))(CONNECT_DATA=(SID=name)))' lazy: true charset: utf8
Takhle mi to funguje na local s MySQL, na produkci mám Oracle a Nette Database mi vrací nula výsledků a DIBI zamrzne a hodí prázdnou stránku bez Tracy. To, že to nefunguje s DIBI to bych třeba oželel, ale že se to tváří, že to komunikuje s DB a nevyhodí to ani jeden ROW, to jsem trošku smutný.
- pesMamlas
- Člen | 8
Tohle mi vyhodí Tracy pro Nette/Database default:
Queries: 1, time: 1.180 ms, default
Time 1.180ms 0 Rows
SELECT *
FROM foo
...\app\presenters\HomepagePresenter.php:22
https://snipboard.io/4n3uWc.jpg
I přes to že v tabulce foo mám 4 záznamy (INSERT a UPDATE fungují). Tuším, že to bude nějaká pitomost, ale nemohu přijít jaká.
Editoval pesMamlas (7. 10. 2020 10:30)
- tkotasek
- Člen | 15
Jelikož jsem našel tohle vlánko, nenašel jsem co jsem potřeboval, tak tu jen odložím nějaké info, kdyby ještě někdo měl tak hloupý nápad jako já propojovat oracle a nette resp. dibi..
konfigurace neon souboru
dibi:
driver: oracle
password: '*****'
username: 'SYS'
database: '(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = *****)(PORT = 1521)))(CONNECT_DATA=(SID=*****)))'
lazy: true
charset: utf8
username, host (za mě je optimální univerzal host.docker.internal), port a SID jsou odvislé od toho co máte v dockeru (nebo někde jinde).
FYI – pokud máte jako já v dockeru
volumes:
- oracle-data:/opt/oracle/oradata
počítejte s tím, že i po změně hodnot v docker-compose.yml třeba hesla, se heslo nezmění a zůstává hezky původní.
Další krok je, že vám bude jako mi několik hodin nadávat laděnka
ORA-28009: connection as SYS should be as SYSDBA or SYSOPER
je potřeba nastavit oci8.privileged_connect = On
ověřit si jestli username je case sensitive a podle toho vyplnit jen SYS a ne SYS AS SYSDBA jak to napovídá
no a potom ručně přepsat
https://github.com/…leDriver.php
Line:50 resp. 52
na
$this->connection = @oci_new_connect($config[‚username‘],
$config[‚password‘], $config[‚database‘], $config[‚charset‘], 2); //
intentionally @
Tedy jen ta dvojka na konci.. define(‚OCI_SYSDBA‘, 2);
@DavidGrudl Tady by stálo za zvážení, jestli nepovolit propisovat poslední parametr $session_mode do oci_new_connect podle konfigurace v neonu.
Třeba to usnadní někomu pár hodin práce. Rozjet oracle v dockeru na arm byla taky docela zábava.
- David Grudl
- Nette Core | 8218
@tkotasek pošli klidně PR (a třeba i do https://github.com/dg/dibi-docs). Oracle nepoužívám, takže s driverem sám od sebe nic dělat nebudu.
- tkotasek
- Člen | 15
David Grudl napsal(a):
@tkotasek pošli klidně PR (a třeba i do https://github.com/dg/dibi-docs). Oracle nepoužívám, takže s driverem sám od sebe nic dělat nebudu.
Sahal jsem právě na Oracle poprvé a docela mě to vytrestalo. Kouknu na PR, jen jsem raději pingnul jestli to není kravina. Díky