Nette\Database multi insert
- h4kuna
- Backer | 740
Nette: 419443f released on 2011–10–07
php: 5.3.1
databáze: postgresql
Ahoj multi insert se mi pomocí \Nette\Database překládá takto
INSERT INTO "categories_has_params" ("categories_id", "params_id")
VALUES ('1', '1'), , ('1', '2')
PS: Docela bych ocenil kdyby data pro multiinsert se vkládala stejným polem jako u dibi
array(
'col1' => array(1,2,3),
'col2' => array('a', 'b', 'c')
)
- Filip Procházka
- Moderator | 4668
Ono je to vcelku jedno, jeden multiinsert tě nezachrání. Spíš bych to vkládání obalil do transakce a na nějaký multiinsert se vykašlal.
- h4kuna
- Backer | 740
redhead napsal(a):
Nicméně to s tím dibi bych nechtěl, odporuje to běžné reprezentaci dat z tabulky a navíc převádění na tento tvar je pro mě iritující.
To záleží, mě se vícekrát hodilo ‚dibi pole‘. Ale byl to jen návrh dokážu pracovat s obojím.
Editoval h4kuna (15. 10. 2011 20:30)
- h4kuna
- Backer | 740
HosipLan napsal(a):
Ono je to vcelku jedno, jeden multiinsert tě nezachrání. Spíš bych to vkládání obalil do transakce a na nějaký multiinsert se vykašlal.
Tvých příspěvků tady na fóru si upřímně vážím, ale mám k té tvé odpovědi výhrady.
- ve frameworku by neměli být nefunkční věci, když jsou tak okaté a když jsem na tuto chybu narazil a viděl že ji zatím nikdo nehlásil tak jsem ji postnul (na git jsem nekoukl :) )
- to co jsi napsal samozřejmě že jsem to tak zatím fixnul
- zkoušel jsi někdy 30 záznamů vložit jedním dotazem nebo 30ti? používám to u tabulek m:n
Editoval h4kuna (15. 10. 2011 20:31)
- Patrik Votoček
- Člen | 2221
h4kuna napsal(a):
- zkoušel jsi někdy 30 záznamů vložit jedním dotazem nebo 30ti? používám to u tabulek m:n
Rychlost uložení 30 záznamů v multi insertu a klasickém insertu by měla být v transakci stejná. Nebo se pletu? (dělat jiné operace než čtení mimo transakci považuju za sebevraždu)
- h4kuna
- Backer | 740
Patrik Votoček napsal(a):
Rychlost uložení 30 záznamů v multi insertu a klasickém insertu by měla být v transakci stejná. Nebo se pletu? (dělat jiné operace než čtení mimo transakci považuju za sebevraždu)
Na straně databáze ano, ale přidej čas php a traffic udělal jsem měření
- 0.018218994140625 multi insert 30 zaznamu query
- 0.050350904464722 insert jednotlivě query
- 0.060348033905029 insert jednotlivě insert
teď si vem že toto je na localhostu
PS: pokud chceš pošlu create sql + inserty + php
Editoval h4kuna (16. 10. 2011 0:40)
- Filip Procházka
- Moderator | 4668
h4kuna napsal(a):
- ve frameworku by neměli být nefunkční věci, když jsou tak okaté a když jsem na tuto chybu narazil a viděl že ji zatím nikdo nehlásil tak jsem ji postnul (na git jsem nekoukl :) )
Pokud si ji nahlásil na githubu, tak jedině dobře. Ale sám víš jak to tady funguje. David má naprosto nepředvídatelné priority při opravování věcí. Proto určitě uznáš, že není od věci, poskytnout dočasné řešení.
- zkoušel jsi někdy 30 záznamů vložit jedním dotazem nebo 30ti? používám to u tabulek m:n
Jo, sice jsem to neměřil, ale mělo by to, minimálně podle dokumentace, být stejně rychlé.
Na straně databáze ano, ale přidej čas php a traffic udělal jsem měření
Když se oháníš měřením, je dobrým zvykem ukázat kód, na kterém jsi to testoval, aby se to dalo snadno replikovat.
Tvých příspěvků tady na fóru si upřímně vážím, ale mám k té tvé odpovědi výhrady.
Nemusíš se „omlouvat“, za to že se mnou nesouhlasíš, nikdo není neomylný a klidně můžu plácnout blbost :)
- Dragon Jake
- Člen | 20
na druhou stranu by se to s tím multi-insertem nemělo přehánět, viz. max_allowed_packet
- h4kuna
- Backer | 740
Patrik Votoček napsal(a):
zajímavé… měl jsi to v transakci?
Jasně
EDIT: expirace tech odkazu je mesic
Editoval h4kuna (16. 10. 2011 13:15)
- h4kuna
- Backer | 740
HosipLan napsal(a):
Pokud si ji nahlásil na githubu, tak jedině dobře. Ale sám víš jak to tady funguje.
Nahlásil to prej redhead
Jo, sice jsem to neměřil, ale mělo by to, minimálně podle dokumentace, být stejně rychlé.
Když přímo v db uděláš multi insert a nebo vložíš 30 insertů za sebou tak to je stejné. Ale na webu toto neděláš.
- h4kuna
- Backer | 740
Trošku jsem hledal co se při tom překladu děje.
<?php
$data = array(array('categories_id'=>3, 'params_id'=>2), array('categories_id'=>4, 'params_id'=>2));
$this->models->categoriesParams->insert($data);
?>
- dostane se sem
- v prvním cyklu se do $vx[] dostane → („categories_id“, „params_id“) VALUES (3, 2)
- v druhém cyklu → , (4, 2)
- a pak tam je implode kterej to zmastí
Řešení
viděl bych to na že v dalších cyklech nevkládat , tzn na řádku 152
- return ', (' . implode(', ', $vx) . ')';
+ return '(' . implode(', ', $vx) . ')';
Jelikož si netroufnu to opravovat pač úplně neznám závislosti, tak alespoň popis toho co se tam děje.
- Filip Procházka
- Moderator | 4668
Dobrá příležitost vyzkoušet si fungování Nette testů, napsat nové a poslat pull :)
- redhead
- Člen | 1313
Ale tak! Stačilo se podívat na GitHub, jak jsem říkal: https://github.com/…tte/pull/279
- David Grudl
- Nette Core | 8082
To není bug, ale rozdíl zápis předpokládal syntaxi
$connection->query('INSERT INTO author',
array(
'name' => 'Catelyn Stark',
'web' => 'http://example.com',
'born' => new DateTime('2011-11-11'),
),
array(
'name' => 'Sansa Stark',
'web' => 'http://example.com',
'born' => new DateTime('2021-11-11'),
)
);
Pull request jsem přijal, ale znamená to BC break a nová (dle mého rozumnější) syntaxe je tedy:
$connection->query('INSERT INTO author', array(
array(
'name' => 'Catelyn Stark',
'web' => 'http://example.com',
'born' => new DateTime('2011-11-11'),
),
array(
'name' => 'Sansa Stark',
'web' => 'http://example.com',
'born' => new DateTime('2021-11-11'),
)
));