Nette\Database multi insert

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

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')
)
redhead
Člen | 1313
+
0
-

Už jsem to dával na github, zatím bez odezvy.

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í.

Editoval redhead (15. 10. 2011 1:35)

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

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.

  1. 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 :) )
  2. to co jsi napsal samozřejmě že jsem to tak zatím fixnul
  3. 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
+
0
-

h4kuna napsal(a):

  1. 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
+
0
-

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í

  1. 0.018218994140625 multi insert 30 zaznamu query
  2. 0.050350904464722 insert jednotlivě query
  3. 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)

Patrik Votoček
Člen | 2221
+
0
-

zajímavé… měl jsi to v transakci?

Filip Procházka
Moderator | 4668
+
0
-

h4kuna napsal(a):

  1. 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í.

  1. 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
+
0
-

na druhou stranu by se to s tím multi-insertem nemělo přehánět, viz. max_allowed_packet

h4kuna
Backer | 740
+
0
-

Patrik Votoček napsal(a):

zajímavé… měl jsi to v transakci?

Jasně

testovaci tabulka

multi insert

insert query

insert pomoci insert

EDIT: expirace tech odkazu je mesic

Editoval h4kuna (16. 10. 2011 13:15)

h4kuna
Backer | 740
+
0
-

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
+
0
-

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);
?>
  1. dostane se sem
  2. v prvním cyklu se do $vx[] dostane → („categories_id“, „params_id“) VALUES (3, 2)
  3. v druhém cyklu → , (4, 2)
  4. 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
+
0
-

Dobrá příležitost vyzkoušet si fungování Nette testů, napsat nové a poslat pull :)

redhead
Člen | 1313
+
0
-

Ale tak! Stačilo se podívat na GitHub, jak jsem říkal: https://github.com/…tte/pull/279

h4kuna
Backer | 740
+
0
-

Tak alespoň ze jsme se shodli :D

David Grudl
Nette Core | 8082
+
+1
-

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'),
    )
));