tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Chyba: PostgreSQL a úvozovky

před 10 lety

theo
Člen | 50

Narazil jsem při používání Dibi hned v prvním dotazu na poměrně nepříjemný problém, který mě ale příliš nepřekvapuje, neb Dibi není první databázová vrstva, která jím trpí.

V PostgreSQL je možné používat jako názvy tabulek a dalších objektů v databázi (např. schémat jako v mém případě) i klíčová slova. Pokud ho chci použít (odhlédněme teď od faktu, že to může být trochu sadomasochistické :), tak ho napíšu jako "user". Jsa zvyklý pojmenovávat věci pravými jmény, potřebuju mít schéma, které se jmenuje user :)

Jenže v tom je kámen úrazu. Dibi mi totiž z dotazu SELECT * FROM "user".users WHERE login=%s udělá dotaz SELECT * FROM 'user'.users WHERE login=%s, což je pochopitelně nesmysl, protože 'user' je řetězcová konstanta, který nemůže být názvem databázového objektu.

Pochopitelně mě napadlo zapsat dotaz jako SELECT * FROM %sql.users WHERE login=%s a předat mu řetězec '"user"' jako parametr, ale Dibi z toho udělá opět 'user'. To je jednoznačně chyba, kterou tímto reportuji a prosím o její opravu.

Díky.

Editoval theo (31. 7. 2009 14:36)

před 10 lety

kravco
Člen | 723

Nie je to chyba.

Dibi má na uzatváranie identifikátorov len dva spôsoby:

`identifikátor`
[identifikátor]

Tieto možno ľubovoľne striedať, ale zväčša človek používa len jeden z nich… Tento zápis sa následne preloží podľa zvyklostí drivera na správne escapovanie – napríklad, dibi vymyslený dopyt

SELECT [from] FROM [order] ORDER BY [count]

preloží (pod postgre driverom) na nasledovné SQL

SELECT "from" FROM "order" ORDER BY "count"

Čokoľvek uzavreté medzi úvodzovkami považuje dibi za reťazec a escapuje ho, taktiež, podľa zvyklostí zvoleného drivera. Domnievam sa, že je to tak kvôli jednoduchému používaniu tých úvodzoviek, ktoré sa práve hodia…

Ako si sa pokúšal, dopyt sa dá zapísať alternatívne pomocou modifikátora, no nepoužil si ten správny. Očakávaný výsledok by si mohol dosiahnuť nasledovne:

dibi::query('
    SELECT *
    FROM %n', 'user', '
    WHERE login = %s', 'Jožko', '
');

Editoval kravco (11. 8. 2009 19:50)

před 10 lety

theo
Člen | 50

Děkuji, za vysvětlení, bohužel přišlo trochu pozdě, neb už jsem začal aplikaci psát na PDO. Nicméně jestli bude chvilka tak těch hotových 5 dotazů ještě zkusím předělat do dibi. Celou věc tímto prosím nadále považujte za uzavřenou :)