PqSql – Class ‚Nette\Database\Drivers\NotImplementedException‘ not found

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

Ahoj,
snažím se rozchodit ukázkový příklad quickstart na databází postgres, ale pokaždé mi to hodí chybu:
Class ‚Nette\Database\Drivers\NotImplementedException‘ not found

a zastaví se to na funkci:
public function getForeignKeys($table)
{
throw new NotImplementedException;
}

Nějaké nápady, co s tím? Díky moc. ;-)

sodae
Nette Evangelist | 250
+
0
-

Samozřejmě, že jde o chybu mělo tam být throw new Nette\NotImplementedException.
A jak název výjimky říká, tato vlastnost (získání cizí klíče v postgres) ještě není implementována, takže quickstart na postgres nejede.

janycta
Člen | 12
+
0
-

Díky moc za odpověď. Nevíte někdo, jak by se toto dalo v postgresu vyřešit, aby příklad fungoval? Bohužel jsem se na tomto problému dost zasekla.

da11niel
Člen | 2
+
0
-

Zkus tam dat tohle :)

public function getForeignKeys($table)
{
	$keys = array();

	$query = "
	SELECT
		tc.constraint_name, tc.table_name, kcu.column_name,
		ccu.table_name AS foreign_table_name,
		ccu.column_name AS foreign_column_name
	FROM
		information_schema.table_constraints AS tc
	JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
	JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
	WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name=" . $this->connection->quote($table);

	foreach($this->connection->query($query) as $id => $row) {
		$keys[$id]['name'] = $row['foreign_column_name']; // foreign key name
		$keys[$id]['local'] = $row['column_name']; // local columns
		$keys[$id]['table'] = $row['foreign_table_name']; // referenced table
		$keys[$id]['foreign'] = $row['foreign_column_name']; // referenced columns
	}

	return array_values($keys);
}
janycta
Člen | 12
+
0
-

Hmmm, bohužel… :-(

PDOException
No reference found for $task->user.

da11niel
Člen | 2
+
0
-

a opravdu tam mas spravne nastavene foreign keys v databazi?

janycta
Člen | 12
+
0
-

No zkoušela jsem i přímo stáhnout již hotový příklad: https://github.com/…03_presenter ze stránky https://doc.nette.org/cs/quickstart, kde by to mělo být správně. Změnila jsem pouze v config.neon informace o databázi a přidala jsem podle Tvé rady tělo funkce do souboru libs\Nette\Database\Drivers\PgSqlDriver.php

Zřejmě se mu nelíbí toto:

<?php
	{foreach $tasks as $task}
	<tr>
		<td>{$task->created|date:'j. n. Y'}</td>
		<td>{$task->text}</td>
		<td>{$task->user->name}</td>
	</tr>
	{/foreach}
?>
hatack
Člen | 2
+
0
-

Můžeš sem poslat schéma té Tvojí databáze? Já dostával podobné chyby, když jsem neměl správně vytvořené primární klíče v tabulkách. Nezkoušel jsem quickstart, měl jsem už hotovou starší aplikaci, kterou předělávám do Nette, udělal jsem něco jako DROP INDEX idx a pak ALTER TABLE user ADD primary key (id) a bylo to už funkční, nic jiného jsem upravovat nemusel.

Milo
Nette Core | 1283
+
0
-

Opravy pro PgSqlDriver mám rozdělané, je tam víc bugů. Tenhle týden to snad stihnu dodělat.

Zkus si zatím stáhnout tento PgSqlDriver a pokud Ti budou vyskakovat chyby, případně i Selection. Na Quickstart by to mělo stačit, do produkce ale opatrně, je to dev.

janycta
Člen | 12
+
0
-

Tak nevím nevím, pořád se mi nějak nedaří. Zkoušela jsem zkopírovat nový PgSqldriver i Selection, ale stále se objevuje tato chyba:

PDOException
No reference found for $task->user

Schéma databáze je zde:

CREATE TABLE task
(
  id serial NOT NULL,
  "text" text NOT NULL,
  created timestamp without time zone NOT NULL,
  done boolean NOT NULL DEFAULT false,
  user_id integer NOT NULL,
  tasklist_id integer NOT NULL,
  CONSTRAINT task_pkey PRIMARY KEY (id)
);

CREATE TABLE tasklist
(
  id serial NOT NULL,
  title text NOT NULL,
  CONSTRAINT tasklist_pkey PRIMARY KEY (id)
);

CREATE TABLE "user"
(
  id serial NOT NULL,
  username text NOT NULL,
  "password" character(128) NOT NULL,
  "name" text NOT NULL,
  CONSTRAINT user_pkey PRIMARY KEY (id),
  CONSTRAINT user_username_key UNIQUE (username)
);
hatack
Člen | 2
+
0
-

A nechybí tam ta reference?

ALTER TABLE task ADD CONSTRAINT fk_user FOREIGN KEY (user_id) references user(id);
ALTER TABLE task ADD CONSTRAINT fk_tasklist FOREIGN KEY (tasklist_id) references tasklist(id);
Milo
Nette Core | 1283
+
0
-

hatack napsal(a):

A nechybí tam ta reference?

ALTER TABLE task ADD CONSTRAINT fk_user FOREIGN KEY (user_id) references user(id);
ALTER TABLE task ADD CONSTRAINT fk_tasklist FOREIGN KEY (tasklist_id) references tasklist(id);

Tak tak, chybí Ti tam cizí klíče mezi tabulkami.

janycta
Člen | 12
+
0
-

No jo vlastně! Tak to se moc omlouvám, teď už to samozřejmě funguje… Díky moc! ;-)