Proč insert provádí také select

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

Ahoj,
mám takový menší problém, když provedu insert, tak to udělá samo taky select. (což nechci)

Můj kod:

/** @var Nette\Database\SelectionFactory */
	protected $database;

$this->database->table("category_translate")->insert(array(
		'name' => $name,
		'language_id' => (int) $lang,
		'category_id' => (int) $categoryID,
));

SQL:

INSERT INTO `category_translate` (`name`, `language_id`, `category_id`)
VALUES ('cccc', 1, 26)

SELECT *
FROM `category_translate`
WHERE (`category_id` = 26) AND (`language_id` = 1)

Vždy jsem si myslel že insert by měl pouze vkládat data.

Ještě poznamenám že insert se provádí v transakci a s WRITE zamčenou tabulkou category_translate.

Možná to na to má nějaký vliv.

Nette 2.1-dev (ae086f2)

Grelek
Člen | 233
+
0
-

Zkus se podívat do API a popřemýšlej nad třídou SelectionFactory, které se ptáš…

Editoval Grelek (21. 7. 2013 13:53)

Myiyk
Člen | 321
+
0
-

Díky za radu

Já to totiž zkopírovat ze sandboxu (řádek 66, je tam taky insert) a neuvažoval jsem nad tím, proč se ta třída tak jmenuje.

Ale má to jednu vadu Nette\Database\Connection::table() is deprecated; use SelectionFactory::table() instead., ale jestli mi ten SelectionFactory dělá při insertu taky select, tak co mám teda použít ???

Editoval Myiyk (21. 7. 2013 14:12)

hrach
Člen | 1838
+
0
-

Je to proto, ze muzes vkladat neco dynamicky, typicky NOW(), vracena data pak obsahuji realna data, ktera jsou v db.

Myiyk
Člen | 321
+
0
-

To chápu, ale je problém, že já si ten insert ani neukládám do proměnné, čekal bych lazy chování, že se bude volat select, až budu něco chtít.

Editoval Myiyk (21. 7. 2013 16:02)

nAS
Člen | 277
+
0
-

@hrach: Nic o tom nevím, NDB nepoužívám, takže už to třeba umí, ale PostgreSQL má klauzuli RETURNING která se přesně na toto používá. Nejen že se ušetří jeden dotaz, ale hlavně je to atomické. Tak by minimálně Postgresí driver mohl využívat toto.

David Grudl
Nette Core | 8228
+
+1
-

Returning je fakt šikovnej! http://jakub.fedyczak.net/post/10/

Myiyk
Člen | 321
+
0
-

Abych tedy provedl pouze insert, tak to musím přes connection->query() ?
V Nette 2.1-dev to jinak nejde ?

Já do DB zapisuju v té tabulce do všech sloupců, takže ten select je mi opravdu na nic.

Ten insert si neukládám do proměnné, takže ani na něm potom nic nevolám. Nevím proč to není lazy, že by se ten select volal až kdybych požádal o nějaká data.

Prosím upravte to, vždyť to takhle dvojnásobí čas pro jeden insert. A k tomu NDB neumí insert několika položek v jednom dotazu.

llook
Člen | 407
+
0
-

Selection API je takové jakoby hloupé ORM. Na to, co chceš, slouží právě Connection::exec()/Connection::query() a ten by měl umět i ten vícenásobný insert.

Akorát místo cool zápisu table('name')->insert(array(...) použiješ méně cool zápis (zato čitelnější) exec('INSERT INTO `name', array(…))`…