• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Wstawianie wielu rekordów naraz do bazy danych

Object Storage Arubacloud
0 głosów
413 wizyt
pytanie zadane 13 listopada 2018 w SQL, bazy danych przez Micheall Początkujący (420 p.)
zamknięte 13 listopada 2018 przez Micheall

Witam :) Próbuję wygenerować hurtowo wiele rekordów i wstawić je do bazy danych PostgreSQL. Wpadłem na pomysł żeby zrobić to za pomocą REST API którą napisałem w php. Na potrzeby generowania danych i wstawienia ich do bazy danych napisałem taką prostą funkcje z użyciem pętli for. Problem w tym że inserty zamiast wykonać się po 1000 razy czasem wykonują się 2000 razy. Z czego to wynika i czy da się to naprawić? Ewentualnie w jaki inny sposób mogę wygenerować szybko te dane i je wstawić? Z góry dziękuję.

public function addMobile(){
				$time= 1514764800;
        $dbcontroller = new DBController();
					for($i=0; $i < 1000; $i++)
					{
					 $value1 = rand(-10,40);
					 $value2 = rand(-30,40);
					 $value3 = rand(-30,50);
					 $value4 = rand(-10,40);
					 $value5 = rand(-20,35);
					 $time+=3600;
					 $query = "insert into measurements(nodeId, data, createdAt) values (13, '[{\"localId\":1,\"value\":".$value1."}]',to_timestamp(".$time.")) ";

					 $dbcontroller->executeAddQuery($query);
			    }
		    }

A to klasa DBController:

<?php
class DBController {
        private $conn = "";


        function __construct() {
                $conn = $this->connectDB();
                if(!empty($conn)) {
                        $this->conn = $conn;
                }
        }

        function connectDB() {
                $conn = pg_connect("host=localhost dbname=iot user=user password=baza");
                return $conn;
        }

        function executeSelectQuery($query) {
                $result = pg_query($this->conn,$query);
                while($row=pg_fetch_assoc($result)) {
                        $resultset[] = $row;
                }
                if(!empty($resultset))
                        return $resultset;
        }
         function executeAddQuery($query) {
                $result = pg_query($this->conn,$query);

        }

}
?>

 

komentarz zamknięcia: Otrzymałem odpowiedź.

1 odpowiedź

+1 głos
odpowiedź 13 listopada 2018 przez Chess Szeryf (76,710 p.)
wybrane 13 listopada 2018 przez Micheall
 
Najlepsza
<?php

$thousand_queries = '';

for($i=0;$i<10;$i++) {
	$thousand_queries .= 'insert into r2 value(\'garlic'.$i.'\');';
}

echo $thousand_queries;


$q2 = $db_conn->multi_query($thousand_queries);

var_dump($q2);

?>

Inna opcja to zapewne napisanie procedury/funkcji po stronie bazy danych.

http://php.net/manual/en/mysqli.multi-query.php

komentarz 13 listopada 2018 przez Micheall Początkujący (420 p.)
Super. Bardzo dziękuję :)
komentarz 13 listopada 2018 przez Micheall Początkujący (420 p.)
edycja 13 listopada 2018 przez Micheall

@Chess, Tylko że ta funkcja którą podałeś jest do MySQL a ja potrzebuje tego do POSTGRESQL. Da się tak zrobić z pg_querry? ;)

EDIT: Da się zrobić to dokładnie analogicznie tak jak napisałeś tylko z pg_query zamiast multi_query :D Dziękuję jeszcze raz. Temat do zamknięcia.

 

komentarz 13 listopada 2018 przez Chess Szeryf (76,710 p.)

query

The SQL statement or statements to be executed. When multiple statements are passed to the function, they are automatically executed as one transaction, unless there are explicit BEGIN/COMMIT commands included in the query string. However, using multiple transactions in one function call is not recommended.

http://php.net/manual/en/function.pg-query.php

https://forums.whirlpool.net.au/archive/445803

Użyj wcześniej BEGIN/COMMIT, nie wiem za bardzo jak jest w PostgreSql.

pg_query($conn, $query);

Musisz chyba wcześniej dać zapytanie:

begin;

później, ten kod wyżej

i na końcu

commit;

Ale nie jestem do końca tego pewien, musisz doczytać w dokumentacji.

Podobne pytania

0 głosów
2 odpowiedzi 556 wizyt
pytanie zadane 8 kwietnia 2016 w SQL, bazy danych przez Jaroslaw Roj Obywatel (1,990 p.)
0 głosów
1 odpowiedź 239 wizyt
0 głosów
1 odpowiedź 136 wizyt
pytanie zadane 31 października 2016 w PHP przez Q_Nick Mądrala (5,010 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...