Nette PDO driver a Oracle Databaze

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Migilenik
Člen | 1
+
0
-

Zdravim,

Chtěl bych se optat na zkušenosti s Oracle databazí. Mám v PHP napsanou vlastní třídu, kde pomocí OCI8 bezproblémově vzdáleně pracuji s Oracle databází, nicméně přestávám věřit, že je to v Nette možné.

Sic v adresářích Nette vidím jakýsi OCI driver, ale o připojení se mi může jen zdát. Requirements checker hlásí „PDO extension or PDO drivers are absent. You will not be able to use Nette\Database“.

Což by to sic vysvětlovalo, nicméně to spíš problémy přidává. Pecl install oci8 fungoval, nicméně zřejmě je potřeba ještě pdo_oci8, jenže ten zase vyžaduje modul PDO. Pecl PDO zahlásí, že je zastaralý, spusti instalaci a pak selže u make.

Zastaralý? Okej, podíváme se na google a dostanu http://pecl.php.net/package/PDO_OCI odkud se tedy poslušně presunu na http://php.net/….pdo-oci.php, no a zpátky na stromy, ??kompilovat?? PHP a ještě kvůli experimentální podpoře. Zpět na stromy.

Takže Nette a Oracle ee? Nebo je tu nějaká cesta? Například našroubovat moji třídu s připojením k Oraclu do Nette?

Předem díky za tipy.

Sonic
Člen | 6
+
0
-

Ahoj,
já používám s Oraclem knihovnu dibi. Vše funguje, akorát pro seek si musíš napsat vlastní funkci a smířit se, že nebude tak super výkonný, jako u jiným db. (není nativní z php)

ryvova
Člen | 9
+
0
-

Ahoj,

snažím se rozchodit Oracle pod Nette 2.1.

confing.neon:
parameters:
    database:
        driver: oci
        host: localhost
        dbname: localhost/xe
        user: cah
        password: *****

services:
    - Model\UserManager
    - App\RouterFactory
    router: @App\RouterFactory::createRouter

    databaseConnection:
        class: Nette\Database\Connection(
            '%database.driver%:host=%database.host%;dbname=%database.dbname%', %database.user%, %database.password%)
    database:
        Nette\Database\Context(@databaseConnection)

UserManager mi spadne na SQLSTATE[IM001]: Driver does not support this function: driver doesn't support meta data. Jakým způsobem psát dotazy, když driver nepodporuje metadata?

Dík

hrach
Člen | 1838
+
0
-

Jak aktualni dokumentace pravi (tj. ta, do ktere jsem zapomnel pridat Oracle),
tak u nekterych driveru/db podporujeme jen klasicky query, ne Nette\Database\Table. Kdyby si byl to ochoten doimplementovat a otestovat… ;)

ryvova
Člen | 9
+
0
-

hrach napsal(a):

Jak aktualni dokumentace pravi (tj. ta, do ktere jsem zapomnel pridat Oracle),
tak u nekterych driveru/db podporujeme jen klasicky query, ne Nette\Database\Table. Kdyby si byl to ochoten doimplementovat a otestovat… ;)

A nebyl by nějaký návod systémem pro úplně blbé jak co nejjednodušeji zprovoznit Nette 2.1 + Oracle? Je mi jedno, jestli to bude Database, Dibi nebo Doctrine 2, hlavně aby to fungovalo. Zatím se mi nepodařilo rozchodit nic z toho.

Dík

mshot
Člen | 7
+
0
-

Z toho co jsem si s tím lehce hrál se s lehkými úpravami dá oracle „použít“ ale prozatím ne plnohodnotně, úpravy které jsem použil jsou (za správnost neručím, snad sem na nic nazapoměl):
Nette\Database\Drivers\OciDriver.php

    public function normalizeRow($row)
    {
        foreach ($row as $key => $value) {
            if (is_resource($value) && strcmp(get_resource_type($value), "stream") == 0) {
                $value = stream_get_contents($value);
                $row[$key]=$value;
            }
        }

        return $row;
    }

public function getColumns($table)
    {
        //throw new Nette\NotImplementedException;
        $columns = array();
        foreach ($this->connection->query('
SELECT ATC.DATA_TYPE,ATC.COLUMN_NAME,ATC.DATA_LENGTH,ATC.NULLABLE,ATC.DATA_DEFAULT,ACC.STATUS
FROM (SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,NULLABLE,DATA_DEFAULT
FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = \'' . $this->delimite($table) . '\') ATC
LEFT JOIN (SELECT COLS.COLUMN_NAME, CONS.STATUS
FROM ALL_CONSTRAINTS CONS, ALL_CONS_COLUMNS COLS
WHERE COLS.TABLE_NAME = \'' . $this->delimite($table) . '\'
AND CONS.CONSTRAINT_TYPE = \'P\'
AND CONS.CONSTRAINT_NAME=COLS.CONSTRAINT_NAME
AND CONS.OWNER= COLS.OWNER) ACC
ON ATC.COLUMN_NAME=ACC.COLUMN_NAME') as $row) {
            $columns[] = array(
                'name' => $row['COLUMN_NAME'],
                'table' => $table,
                'nativetype' => $row['DATA_TYPE'],
                'size' => $row['DATA_LENGTH'],
                'unsigned' => true,
                'nullable' => $row['NULLABLE'] === 'Y',
                'default' => $row['DATA_DEFAULT'],
                'autoincrement' => false,
                'primary' => $row['STATUS'] === 'ENABLED',
                'vendor' => (array)$row,
            );
        }
        return $columns;
    }

    public function getIndexes($table)
    {
        //throw new Nette\NotImplementedException;
        return array();
    }

    public function getForeignKeys($table)
    {
        //throw new Nette\NotImplementedException;
        return array();
    }

„vyradit metadata“ Nette\Database\Helpers.php

public static function detectTypes(\PDOStatement $statement)
	{
		$types = array();
		$count = $statement->columnCount(); // driver must be meta-aware, see PHP bugs #53782, #54695
		for ($col = 0; $col < $count; $col++) {
//			$meta = $statement->getColumnMeta($col);
//			if (isset($meta['native_type'])) {
//				$types[$meta['name']] = self::detectType($meta['native_type']);
//			}
		}
		return $types;
	}

Editoval mshot (27. 2. 2014 22:21)

hrach
Člen | 1838
+
0
-

Diky, ja tento semestr mam ve skole hodne db a taky pracujeme s oraclem, tak to tam pak mozna i dodelam a dotestuju a zamerguju.

mshot
Člen | 7
+
0
-

hrach napsal(a):

Diky, ja tento semestr mam ve skole hodne db a taky pracujeme s oraclem, tak to tam pak mozna i dodelam a dotestuju a zamerguju.

Za málo, já běžně složitější dotazy dělám rovnou přes query ale pro potřeby práce s jednou tabulkou /číselníky je Nette/Database příjemné odstínění od překlepů, výhledově se možná podívám na ty indexy a cizí klíče

David Grudl
Nette Core | 8228
+
0
-

fixed