Jak skamarádit Nette a Oracle DB?

pesMamlas
Člen | 8
+
0
-

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 | 1195
+
+1
-

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
+
0
-

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
+
+1
-

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
+
0
-

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
+
0
-

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)

pesMamlas
Člen | 8
+
0
-

Tak vyřešeno přes dibi. Jen mi vrtá hlavou proč přes Nette/Database fungoval UPDATE a INSERT, jen SELECT nevracel nic.

Díky všem

CZechBoY
Člen | 3608
+
0
-

Mně teda Tracy jen blbě logovalo počet fetchnutých řádků (vždy 0), jinak to fungovalo v pohodě. Zkoušel jsem to teda naposledy někdy ve verzi 2.3, takže už celkem dávno.

Editoval CZechBoY (9. 10. 2020 17:10)

tkotasek
Člen | 15
+
+2
-

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 | 8227
+
0
-

@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
+
0
-

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