Zvlastny problem pri query() – vykona sa dvakrat

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

Nette 2.04
PHP 5.3

Mojim problemom je, ze mi query uvedenu nizsie vykona celkom dvakrat.
Statement je v poriadku, skusal som ho manualne pustat v yogu.
Dovod pre ktory som sa rozhodol pouzit prave query() je rychlost, pretoze dany dotaz sa bude vykonavat periodicky nad tabulkou s 10.000+ zaznamamy a 30 stlpcami. Ak existuje nejaka moznost update-u pomocou Nette/Database v zmysle „cistejsieho“ kodu bol by som rad ak by ste sa so mnou podelili.

$this->_model->database->query("UPDATE `pokus` SET d = c, c = b, b = a, a = 0");
Povodna tabulka:
id	a	b	c	d
---------------------------------
1	1	2	3	4

Ocakavany vysledok
id	a	b	c	d
---------------------------------
1	0	1	2	3

Vysledok v praxi
id	a	b	c	d
---------------------------------
1	0	0	1	2

Napadlo mi samozrejme aj nieco ako:

$rows = $this->_model->getTable();
foreach($rows as $row) {
	$row->d = $row->c
	...
	$row->update();
}

Samozrejme degradacia v rychlosti je velmi citelna.

Chcel som urobit aj nieco ako:

$this->_model->getTable()->update(array(
	'd' => 'c'
	...
));

Ale toto nefungovalo vobec.

Existuje samozrejme moznost ulozenia si celej tabulky do php pola. V poli vykonat co treba a potom updatnut ale pride mi to ako posledna moznost a chcel by som prioritne vsetko nechat na databazu.

Editoval cuchi (13. 10. 2012 10:59)

h4kuna
Backer | 740
+
0
-

Nevyplatilo by se na takovéto voláni vyrobit proceduru a volat ji? A když si uděláš cyklus na úrovni databáze tak to budeš mí zase znatelně rychlejší a celé to dát do transakce.

Caine
Člen | 216
+
0
-

To spis vypada, ze to nekde volas dvakrat, nez ze by se to spoustelo samo 2×.

cuchi
Člen | 17
+
0
-

Dakujem za pripomenutie procedur, problem vsak zostava kedze aj tak musim proceduru volat cez query().
Urobil som si maly pokus do query() hodil obycajny insert – vykonal sa dvakrat. Skusil som to aj s insert() a vysledok je rovnaky. Mne len pride zvlastne ze ked si program napisem napr takto:

vypisem si tabulku pred update – podla ocakavania
vykonam UPDATE
vypisem si tabulku po update – podla ocakavania
exit;

skontrolujem rucne tabulku v db – query bola vykonana dvakrat

Caine
Člen | 216
+
0
-

Me se porad zda, ze se ti to nejakym zpusobem vola 2× (kdysi davno mi firefox taky spoustel stranku dvakrat, kdyz jsem zmacknul F5).

Asi zkus nejakej log, kterej se nekam ulozi, kdyz se ten tvuj kod spusti..

cuchi
Člen | 17
+
0
-

Skusil som mozillu (predtym to bol Chrome) a funguje to normalne. To by ma v zivote nenapadlo. Script bude aj tak spustany demonom ale potreboval som to debugovat.

Dakujem za pomoc.

Skusil som incognito mode a funguje to aj v chrome, teda predpokladam ze budto cache alebo nejaky plugin je na vine.