Oznámení
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 :)