Postgresql – could not find driver

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

Zkouším postgres a hlásí mi to, že nemá driver. Co k tomu vlastně je zapotřebí – na Linuxu?

h4kuna
Backer | 740
+
0
-

Máš jej nainstalovaný? php5-pgsql

  • libpq5 ale to by si mělo ohlídat
jik
Člen | 146
+
0
-

Ten tam je … v čem by mohl být problém? Není zapotřebí ještě něco?

Milo
Nette Core | 1283
+
0
-

Je ještě potřeba pdo_pgsql.so. Na Debianu v /etc/php5/conf.d/pdo_pgsql.ini.

h4kuna
Backer | 740
+
0
-

A povolený v php.ini, ikdyž to by taky mělo udělat při instalaci.

jik
Člen | 146
+
0
-

quickstart s mysql jede bez problémů:
common: parameters: database:
driver: mysql
host: localhost
dbname: qs
user: root
password: ***

totéž s postgresem nechce:
common: parameters: database:
driver: postgre
host: localhost
dbname: qs
user: ja
password: ***

a hlásí: PDOException could not find driver
Přitom se Symfony Postgres běží v klidu.

Editoval jik (14. 7. 2012 15:42)

jtousek
Člen | 951
+
0
-

Zřejmě máš nainstalovaný modul PostgreSQL, ale chybí ti modul PDO PostgreSQl.

jik
Člen | 146
+
0
-

balík php5-pgsql obsahuje pgsql.so, pdo_pgsql.so a jejich konfiguráky – oba vypadají jako v pořádku. Je nutné zakázat ten pgsql.so?
Podle phpinfo ten driver tam je:
PDO support enabled
PDO drivers mysql, pgsql, sqlite, sqlite2
pdo_pgsql
PDO Driver for PostgreSQL enabled
PostgreSQL(libpq) Version 9.1.3
Module version 1.0.2
Revision $Id: pdo_pgsql.c 314376 2011–08–06 14:47:44Z felipe $

Editoval jik (15. 7. 2012 7:33)

Milo
Nette Core | 1283
+
+1
-

PDO driver se jmenuje pgsql a ne postgre.

jik
Člen | 146
+
0
-

Sláva a děkuji … ale stejně ještě někde váznu:
PDOException #22P02
SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for integer: „f“

a vykukuje tam takováto strašnost:
SELECT * FROM „task“ WHERE („done“ = ?) ORDER BY „created“ ASC

To vypadá jako že se nenahradila proměnná – to je homepagepresenter, ale proč? To by snad nemělo mít s tím ovladačem nic společného – mysql chodí.

Milo
Nette Core | 1283
+
0
-

Jaký typ má sloupec done? Zaměřil bych se na chybu ERROR: invalid input syntax for integer: "f".

PS: Formátuj, prosím

jtousek
Člen | 951
+
0
-

To „f“ je postgresí hodnota pro boolean FALSE. NDB to někde uvnitř ošetřuje, ale jak vidno tak to možná občas selže.

jik
Člen | 146
+
0
-

Nojo, v mysql tabulka vypadá:

CREATE TABLE `task` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `text` varchar(100) NOT NULL,
  `created` datetime NOT NULL,
  `done` tinyint(1) unsigned NOT NULL DEFAULT 0,
  `user_id` int(10) unsigned NOT NULL,
  `tasklist_id` int(10) unsigned NOT NULL,
...
);

Tedy done je nikoliv boolean, ale krátký integer. V pgsql je to podobně:

CREATE TABLE task (
  id serial PRIMARY KEY,
  text varchar(100),
  created timestamp,
  done smallint DEFAULT 0,
  user_id int references users,
  tasklist_id int references tasklist
);

Potom ale proč HomepagePresenter.php obsahuje

	public function renderDefault() {
		$this->template->anyVariable = 'any value';
		$this->template->tasks = $this->context->createTasks()
					->where(array('done' => false))->order('created ASC');

	}

Tak zkouším úpravu:

	public function renderDefault() {
		$this->template->anyVariable = 'any value';
		$this->template->tasks = $this->context->createTasks()
					->order('created ASC');

	}

a:

Fatal Error
Class 'Nette\Database\Drivers\NotImplementedException' not found
jik
Člen | 146
+
0
-

Sakra, sakra, to vypadá, že asi není dopsané. Funkce getForeignKeys má nějaký obsah pouze pro MySQL a Sqlite. Můžu to zkusit zkopírovat do PgSqlDriver.php, ale budu potřebovat nějakou pomoc. MySqlDriver.php obsahuje:

<?php
public function getForeignKeys($table) {
  $keys = array();
  $query = 'SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = ' . $this->connection->quote($table);
  foreach ($this->connection->query($query) as $id => $row) {
    $keys[$id]['name'] = $row['CONSTRAINT_NAME']; // foreign key name
    $keys[$id]['local'] = $row['COLUMN_NAME']; // local columns
    $keys[$id]['table'] = $row['REFERENCED_TABLE_NAME']; // referenced table
    $keys[$id]['foreign'] = $row['REFERENCED_COLUMN_NAME']; // referenced columns
  }
  return array_values($keys);
}
?>

Klíčový asi bude ten řádek $query = … Ale pokud mysql předhodím:

mysql> $query = SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = task;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$query = SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_' at line 1
mysql>
Milo
Nette Core | 1283
+
0
-

Tak si tu strukturu pro PostgreSQL změň na boolean. Jestli ve stable vydání nemáš něco implementováno, podívej se na devel jestli to už někdo neudělal.

jik
Člen | 146
+
0
-

Trefa. Je to tam a jede to. Takže na Postgresql to chce (zatím) devel verzi.
Děkuji.

Editoval jik (17. 7. 2012 15:01)