Nette PDO driver a Oracle Databaze
- Migilenik
- Člen | 1
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.
- ryvova
- Člen | 9
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
- ryvova
- Člen | 9
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
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)
- mshot
- Člen | 7
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