před 2 lety
(aktualizováno 15. 6. 2010 a 27. 4. 2010 a 10. 12. 2010 a 3. 8. 2011)
Mysql ve všech verzích (únor 2010) trpí nepříjemnou vlastnosti. V subselectu neumí použít index. DibiDataSource v knihovně Dibi je celý postavený na subselected, takže je v mysql naprosto nepoužitelný. To by mi ani tak nevadilo, prostě by jsem DataSource nepoužíval, ale…
DataGrid pro Nette Framework je parádní knihovna pro vykreslování tabulek od Romana Sklenáře a jako zdroj dat používá právě pouze DibiDataSource.
Takže máme několik možností: nepoužívat DataGrid, přesvědčit Romana aby ho předělal, nebo změnit DataSource, aby tímhle problémem netrpěl.
Existuje několik možností jak udělat datasource jinak. Já jsem zvolil tu nejméně efektivní: parsovat SQL. Možná se ukáže, že se jedná o slepou uličku vývoje, ale alespoň si budeme moci říct: „Přátelé, tudy ne, tudy cesta opravdu nevede.“ ;]
Moje úprava se prozatímně jmenuje DibiDataSourceX a je to experiment, který není ideální do produkčního řešení. Je potřeba myslet na to, že není 100% kompatibilní.
Aliasy sloupců jdou dále používat jen když jsou escapovány (uzavřené v hranatých závorkách).
$c->dataSourceX('SELECT foo as bar FROM [table]')->where('[bar] = 5');
// OK
$c->dataSourceX('SELECT foo as bar FROM [table]')->where('bar = 5');
// Error: Unknown column 'bar' in 'where clause'
Když je je limit ve zdroji a orderby venku:
$c->dataSourceX('SELECT * FROM [table] LIMIT 10')->orderBy('bar');
// DataSource: SELECT * FROM (SELECT * FROM test LIMIT 10) t ORDER BY `bar`;
// DataSourceX: SELECT * FROM test ORDER BY `bar` LIMIT 10;
Tedy v klasickém DS se nejdřív ze všech vezme 10 záznamů a ty se
seřadí dle bar. V DSX se vše seřadí dle bar a
vybere se 10 záznamů. Vrátí to prostě jiné data. Naštěstí se
většinou takhle DS nepoužívá.
Protože se při limitu musí použít subselect. Nebo ví někdo jak
z dotazu SELECT * FROM [table] LIMIT 50,20 dostat pravdivej count?
Jiné databáze nemají problém. Pak se použije subselect jako
u normálního datasourcu.
Zatím není možné spojovat selecty přes union.
PROCEDURE apod.
V některých případech se stejně musí použít subselect.
->count().->count().->select() nebo
->count().Je lepší se podobným konstrukcím vyhnout. Tedy nepoužít vůbec datasource.
| Verze | 0.2.4 |
| Download | DataSourceX-0.2.4.zip |
| Autor | Petr Procházka (petr@petrp.cz @Petr_P) |
| Licence | „New“ BSD License |
| Homepage | http://petrp.cz/…ce-pro-mysql |
Stáhněte si archiv DataSourceX.zip a obsah složky
/DataSourceX vložte do adresáře %libsDir% ve vašem
projektu.
Vyžaduje Dibi po 2009–11–02
Souborem extension.php zaregistrujete metody jako:
DibiConnection::dataSourceX,
DibiDataSource::toDataSourceX().
require_once LIBS_DIR . '/DataSourceX/extension.php';
DibiFluent::toDataSourceX() momentálně nefunguje, protože
nepodporuje extension method.
$connection = dibi::getConnection();
$dataSource = $connection->dataSourceX('SELECT * FROM [table] WHERE [rohlik] > [chleba]');
$dataSource
->orderBy('marmelada')
->applyLimit(10)
->select(array('rohlik', 'chleba', 'maslo'))
->select('marmelada', 'jam');
$dataSource->getResult()->dump();
DibiDataSourceX 0.2.4 on 2011–08–03
DibiDataSourceX 0.2.3 on 2010–12–10
->select() nebo ->count() se použije subselect;
bohužel to nejde jinak.->count() tak se použije subselect; je to cena za to že to
vrací správný výsledek.DibiConnection::sql() >
DibiConnection::translate().DibiDataSourceX 0.2.2 on 2010–06–15
DibiDataSourceX 0.2.1 on 2010–04–27
[table.foo]DibiDataSourceX 0.2 on 2010–02–25
Programátor, kodér a webový vývojář na volné noze.
Petr Procházka
před rokem
Z tiskárny si vždy na flashce přinesu virus. To neslyšeli o antivirech a
zakázání autorunu?
Petr Procházka
před rokem
Blbne mi aplikace budík. NEJDE vypnout buzení. To je nejhorší porucha která
může nastat. #android
Petr Procházka
před rokem
Pracovní počítač mi zkolabuje skoro vždy když přeskládávám větší
množství commitů. Dnes mi to naprosto zlikvidovalo repository. #git
Petr Procházka
před rokem
Na mém HTC Hero se mi v aplikaci zobrazuje google reklama „Mobil od Googlu
HTC Hero“. Kontextová reklama dotažená do dokonalosti.