Nette database postgresql schema
- 2bfree
- Člen | 248
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
Ř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
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
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 :)
- edke
- Člen | 198
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)
- edke
- Člen | 198
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 :)