Postgresql – could not find driver
- jik
- Člen | 146
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)
- jik
- Člen | 146
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)
- jik
- Člen | 146
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í.
- jik
- Člen | 146
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
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>