Nette database postgresql schema

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

Zdravím,

snažil jsem se v Nette\Database na postgresql sepsat pres fluent interface nasledujici relativne jednoduchy select:

SELECT
	"user"."name"
FROM
	"admin"."user"
LEFT JOIN
	"admin"."user_account"
ON
	"admin"."user_account"."user_id" = "admin"."user"."id"
WHERE
	"user_account"."identifier" = 'identifikator'

a neustale narazim na problem s definici postgresql schematu.
Jak se to dela spravne?

Editoval 2bfree (13. 4. 2012 16:05)

Ot@s
Backer | 476
+
0
-

Řeším to tak, že dědím Nette/DB do vlastního objektu a těsně po samotné connection provádím
SET search_path = admin, user, pg_catalog. Fungovat to bude, pokud máš ve schématech různé názvy tabulek. V opačném případě volit jedno schéma primární a do něj založit pohledy, které budou šahat do ostatních schémat. Nehezhé, nepraktické, leč funkční. Samozřejmě nejlogičtější by bylo, kdyby to fungovalo takto napřímo…
PS: jedu na 2betě, třeba se od té doby v této věci něco změnilo…

2bfree
Člen | 248
+
0
-

Používáme verzi 2.0.3 a nic. Jen mě mrzí 4 dny promrhaného času a zkoušení, když se David Grudl nechal slyšet že už je to hotové a připravené a nakonec to vypadá že není ani základ.

Snad brzy.

Filip Procházka
Moderator | 4668
+
0
-

Mimochodem, Nette\Database neumí fluent tak jako dibi.

2bfree
Člen | 248
+
0
-

To mimochodem vim, ale přesto to dle ukazek jednoduche inner joiny pres cizi klice zvlada. Ale ne na postgres, kde se musi definovat schema. ;(

Ot@s
Backer | 476
+
0
-

PgSQL a Fluent v NetteDb obcházím pomocí temporrary view. V modelu něco na způsob

public function getData() {
	$this->dbcon->query('CREATE TEMP VIEW mojedata AS SELECT t1.* FROM t1 ....');
	return $this->dbcon->table('mojedata');
}
hrach
Člen | 1834
+
0
-
  • framework jako takovy hotovy nikdy neni
  • urcite se nenechal slyset, ze je ndb pripravene pro postgre.
  • to, ze ti trvalo 4 dny zjistit, ze to nefunguje je jen tvuj fail a nezkusenost.
  • proc do toho michas dibi (fluent)? wtf?
2bfree
Člen | 248
+
0
-

hrach napsal(a):

  • framework jako takovy hotovy nikdy neni
  • urcite se nenechal slyset, ze je ndb pripravene pro postgre.
  • to, ze ti trvalo 4 dny zjistit, ze to nefunguje je jen tvuj fail a nezkusenost.
  • proc do toho michas dibi (fluent)? wtf?
  • O hotovosti „frameworku“ nikdo nemluvil
  • Nechal se slyset, ze je hotovy. Ze je hotovy „pro cokoliv“ je podmnožina slova hotový
  • To že věnuji dostatek času, než řeknu o někom že chybuje je možná nezkušenost, zato však slušnost
  • Protože Dibi je knihovna, na kterou jsem posléze přešel.

Děkuji za tvou neutuchající potřebu pomoci a poradit. Taková pomoc je opravdovým přínosem komunitě.
Přeji ti mnoho dalších dobrých pocitů nadřazenosti.

Filip Procházka
Moderator | 4668
+
0
-

Ráno mě přepadlo chvilkové nadšení, že ten driver dodělám, ale jak jsem rychle začal tak jsem rychle skončil po nainstalování postgre :-/

Pokud se ti ten driver nechce dělat, tak bude asi lepší vrátit se k dibi :)

Ot@s
Backer | 476
+
0
-

HosipLan napsal(a):

Ráno mě přepadlo chvilkové nadšení, že ten driver dodělám, ale jak jsem rychle začal tak jsem rychle skončil po nainstalování postgre :-/

To tě tak PostgreSQL otrávil? Nebo jiný důvod? :-)

Filip Procházka
Moderator | 4668
+
0
-

Lenost :)

edke
Člen | 198
+
0
-

2bfree wrote:

Zdravím,

snažil jsem se v Nette\Database na postgresql sepsat pres fluent interface nasledujici relativne jednoduchy select:

SELECT
	"user"."name"
FROM
	"admin"."user"
LEFT JOIN
	"admin"."user_account"
ON
	"admin"."user_account"."user_id" = "admin"."user"."id"
WHERE
	"user_account"."identifier" = 'identifikator'

a neustale narazim na problem s definici postgresql schematu.
Jak se to dela spravne?

Ahoj.

Pracujem vylucne s PostgreSQL a Nette\Database nie je pre tuto db uplne idealna volba. Jednak prave problemy so schemas ale aj niekedy sa snazi cez Discovery natrepat do sql joiny, ktore tam nemaju co robit. Osobne by som bol zato (mozno sa to da, len som zatial nato neprisiel), keby sa Discovery dalo uplne vypnut a zakazat Nette\Database aby akokolvek zasahovalo do mojho query.

Tvoj problem sa da poriesit cez aliasy:

SELECT "u"."name"
FROM "admin"."user" AS "u"
LEFT JOIN "admin"."user_account" AS "ua" ON "ua"."user_id" = "a"."id"
WHERE "ua"."identifier" = 'identifikator'

Ja osobne riesim takmer vsetko cez VIEWS a RULES a vyuzivam pritom Nette\Database\Table\Selection ako aj Nette\Database\Table\ActiveRow. Vyuzivam aj dedicnost tabuliek v PostgreSQL, co v niektorych situaciach vyborne riesi niektore KISS a DRY mechanizmy ohladne modelu.

Zakladna struktura:

create schema media;

create table media.folder (
	id serial not null primary key,
	name character varying not null unique,
	created timestamp without time zone not null,
	modified timestamp without time zone not null
);

create table media.file (
	id serial not null primary key,
	id_folder integer not null references media.folder(id),
	filename character varying not null,
	created timestamp without time zone not null,
	modified timestamp without time zone not null
);

alter table media.file add unique (id_folder, filename);

Teraz si vytvorim najprv VIEW a ten si vyskladam tak, ako potrebujem:

create view media.file_default as
select fi.*, fo.name as folder
from media.file as fi
inner join media.folder as fo on fo.id = fi.id_folder;

No a potom uz pracujem s takymto vyskladanym pohladom ako s jednoduchou tabulkou:

$files = $this->context->database->table('media.file_default');
foreach($files as $file) {

};

Ak ti ide len o citanie dat, tak RULES nepotrebujes. Ak ale pri takomto pohlade chces zas vyuzit silu ActiveRow, napises si RULE na UPDATE:

create rule "UPDATE" as
	on update to media.file_default do instead
	update media.file
	set filename = new.filename
	where file.id = new.id;

Potom uz vies aj na zaznam vybraty z takehoto pohladu pouzit ActiveRow a jeho ->update();

Da sa ist dalej, namiesto VIEW vies napisat proceduru a cez TABLE pristupujes potom k datam aj s parametrom. Zatial sa to v Nette\Database da zapisat len skaredo, ale kto vie, mozno raz :)

//aktualne funguje
$messages = $this->context->database->table('mailer.queue_of_user(1)');

//krajsie by bolo
$messages = $this->context->database->table('mailer.queue_of_user(?)', $idUser );

Editoval edke (18. 4. 2012 12:24)

2bfree
Člen | 248
+
0
-

Děkuji všem za pomoc. Smyslem tohoto tématu bylo zjistit, zda-li dělám někde chybu, nebo opravdu není podpora pro Postgre dokončena.

Ta evidentně není a tak s klidem přecházím na Dibi.

edke
Člen | 198
+
0
-

2bfree wrote:

Děkuji všem za pomoc. Smyslem tohoto tématu bylo zjistit, zda-li dělám někde chybu, nebo opravdu není podpora pro Postgre dokončena.

Ta evidentně není a tak s klidem přecházím na Dibi.

Ze nedokoncena, az tak by som to nenazval. Zas ak uz mam priamo vo Frameworku databazovy layer a jediny problem ktory mam vyriesit aby som ho mohol pouzit je alias namiesto zapisu schema.table.column, tak to mi stoji zato, aby som nepotreboval do projektu pridat dalsiu kniznicu a este aj tam riesit pripadne nekompatibility so samotnym frameworkom.

Predsa len uz do buducna bude zrejme Nette\Database pre Nette odladenejsia a zabezpecena vyvojom, ako samotne Dibi. Dibi zas postrada ActiveRow, toto by mi uz dnes chybalo :)