Sunday, November 22, 2020

Laravel Upserts : Cara mengimport kumpulan data secara efisien

Dirilis pada 13 Oktober 2020, Laravel 8.10 hadir dengan penambahan upsert() pada pembuat kueri database (dan karena itu kueri berbasis Eloquent juga). Ini memungkinkan Anda melakukan kueri "sisipkan atau perbarui" jauh lebih efisien yang akan membantu saat mengimpor data dalam jumlah besar.

 


Q : Mengapa menggunakannya? Bagaimana cara kerjanya? Bagaimana kinerjanya? Bagaimana cara saya menggunakannya?

 

Contoh praktis penggunaan upsert ()

 

Hingga saat ini, pembuat kueri basis data Laravel mendukung penyisipan atau pembaruan beberapa baris (kumpulan data) sekaligus melalui metode insert() dan update(). Ada juga insertOrIgnore() yang kurang dikenal yang akan memasukkan sekumpulan data, mengabaikan kesalahan apa pun (seperti kunci unik yang sudah ada).

Laravel juga memiliki updateOrCreate() pada model Eloquent yang memberikan sekumpulan atribut, memperbarui model yang ada, atau jika tidak ada, model yang dibuat. Namun, ini hanya dapat digunakan pada satu baris / model dalam satu waktu - jika kita memiliki 125.000 baris untuk disisipkan atau diperbarui, kita harus memanggil metode Eloquent itu sebanyak 125.00 kali. Di balik layar, ini sebenarnya mengeksekusi dua kueri dalam database satu untuk memeriksa entri yang ada dan satu lagi untuk melakukan INSERT atau UPDATE sehingga berarti menjalankan 250.000 kueri. Itu bisa lambat.

Jadi mari kita bayangkan kita memiliki file CSV yang berisi data untuk 125.000 produk yang perlu kita impor ke database kita seefisien mungkin. Tidak masalah, kita bisa menggunakan insert() pada pembuat kueri untuk menyisipkan beberapa baris sekaligus.

Kita percepat ke 4 minggu kemudian, kami memiliki file CSV data produk baru dengan rincian 125.000 produk telah diperbarui dan 25.000 produk baru telah ditambahkan. Dalam database kami, kami perlu memperbarui produk yang ada dan memasukkan yang baru. Untuk melakukan ini, kita perlu mengetahui produk mana yang sudah kita miliki, dan mana yang baru sehingga kita dapat melakukan kueri INSERT atau kueri UPDATE.

Daripada menggunakan updateOrCreate() 150.000 kali untuk setiap baris dalam file CSV, mari kita mulai dengan memecah file CSV menjadi beberapa kelompok yang lebih kecil, misalnya 5.000 produk. Itu memberi kami 30 batch.

Kemudian kita dapat meneruskan setiap kumpulan data produk ke upsert() di kelas Illuminate\Database\Query\Builder, yang untuk setiap baris data dalam file CSV akan memperbarui produk yang ada di database kita, atau membuat yang baru. Dengan cara ini kami hanya akan mengeksekusi 30 kueri daripada 300.000 jika kami menggunakan updateOrCreate() (ingat, sebenarnya ini ada 2 kueri untuk setiap penggunaannya).

Jadi bagaimana cara kerja upsert ()?

Saya akan menganggap Anda menggunakan MySQL, meskipun itu berfungsi dengan mesin database lain.

Mengikuti dari contoh database produk kami, yang disederhanakan untuk kumpulan hanya 3 produk, berikut adalah SQL yang akan dijalankan:

INSERT INTO products 
(item_ref, title, price) 
VALUES 
(1, 'Large cake', 15.00), 
(1, 'Medium cake', 10.00), 
(1, 'Small cake', 5.00) 
ON DUPLICATE KEY 
UPDATE 
item_ref = values(item_ref), 
title = values(title), 
price = values(price);

Seperti yang Anda lihat, kueri dimulai dengan pernyataan normal INSERT dan akan mencoba memasukkan kumpulan nilai data pertama ke dalam tabel. Jika berhasil, ini akan dipindahkan ke set berikutnya. Namun, jika gagal karena pengenalan unik (dalam contoh kita, yaitu "item_ref") sudah ada (yaitu baris data sudah ada di tabel), maka itu akan ditangkap oleh ON DUPLCIATE KEY bagian dari kueri. SQL setelah itu, dalam hal ini sebuah pernyataan UPDATE, kemudian akan dijalankan. Ini akan memperbarui baris database yang ada dengan sekumpulan nilai. Setelah selesai, ini akan pindah ke kumpulan nilai data berikutnya.

Bagaimana kinerja upsert ()?

Untuk menguji kinerja upsert(), saya memulai proyek Laravel baru dan membuat perintah artisan sederhana yang melakukan 3 pengujian menggunakan updateOrCreate , menggunakan upsert() metode untuk baris tunggal, dan menggunakan upsert() dengan kumpulan baris (5.000 pada suatu waktu).

Untuk setiap pengujian, larik 125.000 "produk" ditulis ke tabel kosong - mengukur waktu yang dibutuhkan untuk menyelesaikannya. Setiap item dalam larik asli data produk kemudian diperbarui dengan harga baru, dan 25.000 produk ditambahkan. Data mentah yang diperbarui ini kemudian juga ditulis ke database sementara waktunya.

Saya memutar server baru di Linode (dengan PHP 7.4 & MySQL 8) dan menjalankan perintah artisan 5 kali. Saya menghitung rata-rata waktu dari setiap tes, yang berakhir sebagai berikut:

Tes 1 ( updateOrCreate()metode)

·         INSERT: 280,84 detik

·         INSERT / UPDATE: 398,76 detik

Tes 2 ( upsert()metode - baris tunggal)

·         INSERT : 203,99 detik

·         INSERT / UPDATE: 270.39 detik

Tes 3 ( upsert()metode - baris bertumpuk)

·         INSERT: 15,38 detik

·         INSERT / UPDATE: 17.97 detik

Seperti yang diharapkan, tes pertama dengan updateOrCreate() yang paling lambat. Pengujian kedua, menggunakan upsert() untuk setiap produk satu per satu sedikit lebih cepat karena hanya mengeksekusi 1 kueri untuk setiap produk, bukan 2. Terakhir, pengujian ketiga, menggunakan upsert() untuk batch (5.000) produk jauh lebih cepat dibandingkan dua tes lainnya. Dalam pengujian saya, ini bekerja pada 95% lebih cepat untuk kueri INSERT  dan kueri INSERT / UPDATE , jika dibandingkan dengan updateOrCreate().

Bagaimana saya bisa menggunakan upsert ()?

Metode ini tersedia dari pembuat kueri database Laravel, dan pembuat kueri Eloquent. Ini menerima 3 argumen:

upsert(array $values, $uniqueBy, $update = null)

 

$ Values

Argumen pertama adalah array array yang berisi data yang akan disisipkan / diperbarui - satu array anak untuk setiap baris model / database Eloquent. Sebagai contoh:

$values = [
    [
        'item_ref'  => 1,
        'title'     => 'Large cake',
        'price'     => 15.00,
    ],
    [
        'item_ref'  => 2,
        'title'     => 'Medium cake',
        'price'     => 10.00,
    ],
    [
        'item_ref'  => 3,
        'title'     => 'Small cake',
        'price'     => 5.00,
    ]
];

Jika Anda menggunakan upsert() model Eloquent yang menggunakan stempel waktu, atribut created_at dan updated_at akan ditangani secara otomatis.

 

$ uniqueBy

Argumen kedua menjelaskan cara mengidentifikasi baris unik.

Ini bisa berupa nama kolom tunggal (diteruskan sebagai string, atau larik yang berisi string tunggal), atau jika Anda memiliki kunci komposit (dua kolom atau lebih yang digunakan untuk mengidentifikasi baris secara unik), nama beberapa kolom diteruskan sebagai sebuah array. Sebagai contoh:

$uniqueBy = 'item_ref';
// OR
$uniqueBy = ['item_ref'];
// OR
$uniqueBy = ['item_type', 'item_size'];

Semua mesin database kecuali SQL Server memerlukan kolom dalam argumen $ uniqueBy untuk memiliki indeks "primer" atau "unik".

 

$update

Argumen ketiga dan terakhir, yang bersifat opsional, menentukan kolom yang harus diperbarui jika baris yang cocok sudah ada dalam database. Ini memungkinkan Anda untuk memasukkan data dalam $values argumen Anda yang hanya akan ditulis di INSERT. Secara default, semua kolom di Anda $values diperbarui, tetapi berikut adalah contoh jika Anda ingin memberikan argumen ini:

$update = ['title', 'price'];

 

Tuesday, September 15, 2020

Perulangan pada Python dan contohnya (2.2)

Kita hampir selalu melakukan perulangan didalam suatu pemograman. Python menyediakan berbagai alat dan fungsi yang membuat perulangan yang kita lakukan semakin menyenangkan. Perulangan dapat dulakukan dengan statement for dan while. Namun pada kesempatan kali ini saya akan membahas perulangan menggunakan while.

 
sumber : python.org

Perulangan menggunakan while memiliki ciri-ciri pengecekkan kondisi. Perulangan Dilakukan di awal perulangan tersebut.

Berikut tabel penggunaan while.

Kategori
Contoh
Perulangan sederhana
while x<10:
            print x,
            x = x + 1
Perulangan di dalam perulangan
while x<10:
           while y<10:
                      print y,
                      y = y + 1
           print x,
           x = x +1
Perulangan terus-menerus
while 1:
           print ‘forever’
Perulangan dengan else
while x<10:
           print x,
           x = x+ 1
else:
           print ‘perulangan selesai’

Untuk lebih jelasnya berikut ini contoh-contoh penggunaan perulangan pada Python.

>>> x = 1
>>> while x<10:
...             print x,
...             x = x + 1
...

Dan berikut adalah hasilnya:


Contoh ini mengilustrasikan perulangan biasa, yang akan mencetak nilai x selama x masih lebih kecil dari sepuluh. Setiap kali perulangan, nilai x ditambah satu. Sekali lagi tanda koma (,) yang berada diakhir perintah print, berguna untuk mencegah dicetaknya baris baru setiap perulangan dikerjakan.

Contoh lain dari perulangan pada Python:

>>> x = 'Apa kabar teman?'
>>> while x :
...             print x
...             x = x [1:]

Dan sebagai hasilnya:


Contoh ini mengilustrasikan perulangan yang menghilangkan setiap karakter pertama sebuah string dengan menggunakan irisan. While x pada contoh di atas berarti selama x masih bernilai dan tidak kosong.

Contoh dari perulangan terus-menerus pada Python.

>>> x = 1
>>> while 1:
...             print x,
...             x = x + 1
...             if x > 9:
...                        break
...

Dan berikut adalah hasilnya:


Contoh ini seharusnya megilustrasikan perulangan terus-menerus dikarenakan kondisi while 1:, tetapi kita memiliki statement break yang dikerjakan jika nilai x telah lebih besar dari sembilan. Hal inilah yang mengendalikan perulangan, shingga perulangan tidak jadi dilakukan terus-menerus. Perintah break menyebabkan perulangannya selesai.

Contoh lain dari perulangan pada Python yang menampilkan angka genap.

>>> x = 0
>>> while x<10:
...     x = x + 1
...     if x % 2 :
...             continue
...     else:
...             print x,
...

Dan berikut ini adalah hasilnya


Contoh ini megilustrasikan suatu perulangan di mana pada kondisi tertentu kita melompati suatu perulangan. Pada contoh diatas, jika x adalah bilangan ganjil, dimana sisa baginya bukan nol, kita tidak melakukan pencetakkan  terhadapnya. Perintah untuk melompati suatu perulangan adalah continue.

Untuk angka ganjil.

>>> x = 0
>>> while x<10:
...               x = x + 1
...               if x % 2 == 0:
...                              continue
...     else:
...               print x,
...

Dan hasilnya sebagai berikut :


Contoh lain dari perulangan pada Python. 

>>> x = 1
>>> while x<10:
...               print x,
...               x = x + 1
... else:
...               print 'perulangan telah selesai dilaksanakan'
...

Dan hasilnya sebagai berikut:


Contoh ini mengilustrasikan penggunaan else yang akan dikerjakan begitu perulangan tidak dikerjakan lagi

Perulangan dengan for pada Python

Perulangan menggunakan for mungkin adalah perulangan yang paling sederhana. Perulangan ini terdapat di hampir semua bahasa pemograman populer.


Sumber: python.org

Berikut tabel penggunaan for pada Python.

 Kategori
Contoh
 Perulangan sederhana
 for x in range (0,10):
            print x,
 Perulangan di dalam perulangan
 for x in range (0,10):
            for y in range (0,10):
                    print y,
 Perulangan dengan else
 for x in range (0,10):
            print x,
else:
            print 'selesai'
  
Berikut contoh lain penggunaan for pada Python.


 >>> for x in range (0,15):
...     print x,
...




Dan berikut hasilnya:


Contoh ini mengilustrasikan penggunaan for dimana kondisi perulangan dari berapa sampai berapa dilakukan dengan fungsi range. Berikut ini adalah penggunaan fungsi range :


Parameter pertama adalah nilai awal perulangan, parameter kedua adalah batas perulangan dan parameter ketiga adalah jumlah penambahan. Parameter ketiga akan bernilai 1 apabila tidak diberikan.

Daftar pustaka : "Python dan Pemograman Linux" karangan Noprianto

Contoh Penggunaan Array Dan String Untuk Menghitung Jumlah Huruf Vokal, Konsonan, Angka Dan Spasi Menggunakan C++

Hai teman-teman, pada kali ini akan menunjukkan sebuah implementasi bahasa pemograman C++ untuk menghitung jumlah huruf vokal, konsonan, angka dan spasi yang ada pada suatu kalimat.

sumber gambar: sdtimes.com

Untuk lebih lanjutnya berikut ini sintaxnya:

#include <iostream>

using namespace std;



int main()

{

    char garis[150];

    int vokal, konsonan, angka, spasi;



    vokal =  konsonan = angka = spasi = 0;



    cout << "masukkan kalimat disini: ";

    cin.getline(garis, 150);

    for(int i = 0; garis[i]!='\0'; ++i)

    {

        if(garis[i]=='a' || garis[i]=='e' || garis[i]=='i' ||

           garis[i]=='o' || garis[i]=='u' || garis[i]=='A' ||

           garis[i]=='E' || garis[i]=='I' || garis[i]=='O' ||

           garis[i]=='U')

        {

            ++vokal;

        }

        else if((garis[i]>='a'&& garis[i]<='z') || (garis[i]>='A'&& garis[i]<='Z'))

        {

            ++konsonan;

        }

        else if(garis[i]>='0' && garis[i]<='9')

        {

            ++angka;

        }

        else if (garis[i]==' ')

        {

            ++spasi;

        }

    }



    cout << "jumlah vokal: " << vokal << endl;

    cout << "jumlah konsonan: " << konsonan << endl;

    cout << "jumlah angka: " << angka << endl;

    cout << "jumlah spasi: " << spasi << endl;



    return 0;

}

Sumber Pustaka : programiz.com

Penggunaan Seleksi pada Python (2.2)

Didalam melakukan suatu pemograman, kita hampir selalu berhadapan dengan kondisi dimana kita harus memilih. Untuk melakukan seleksi kita bisa mempergunakan sintaks if. Python tidak memiliki statement switch seperti halnya di C, atau case seperti halnya di Pascal. Tetapi kita akan mensimulasikan keduanya setelah kita membahas tentang if.

 
sumber: python.org


Tabel Penggunaan Seleksi

Kategori
Contoh
if tunggal
if x == 1:
          print ‘x bernilai 1’
if dengan else
if x ==  1:
          print ‘x bernilai 1’
else:
         print ‘x tidak bernilai 1’
if dengan pilihan if lainnya
if x == 1:
        print ‘x bernilai 1’
elif x == 2:
        print ‘x bernilai 2’
else:
        print ‘ x tidak bernilai 1 atau 2’
if di dalam if
if x == 1:
           if y ==1:
                     print ‘x dan y bernilai 1’

Sebagai contoh :
>>> x = 1
>>> if x ==1:
...     print 'x bernilai 1'
... elif x ==2:
...     print 'x bernilai 2'
... else :
...     print 'x tidak bernilai 1 atau 2'
...


Dan hasilnya: 


Contoh ini mungkin adalah contoh yang paling lazim ditemukan, berguna untuk melakukan tes terhadap suatu kondisi, dalam hal ini nilai x.

Berikut contoh lain dari seleksi pada python.
>>> x=1
>>> y=2 if x ==1:
...     if y ==1:
...             print 'x dan y sama-sama bernilai 1'
...     else:
...             print 'x bernilai 1 sedangkan y tidak bernilai 1'
...     else:
...     print 'x tidak bernilai 1'
...

Dan hasilnya sebagai berikut.


Contoh ini adalah contoh penggunaan if secara tersarang. Hal ini biasanya digunakan untuk melakukan tes yang memiliki banyak persyaratan.

Berikut contoh lain dari seleksi pada Python.

>>> x =1
>>> if x:
...       print 'benar'
...    else:
...       print 'salah'
...
benar
>>> x = 0
>>> if x:
...        print 'benar'
...     else:
...        print 'salah'
...

Sebagai hasilnya:


Contoh ini mengilustrasikan tes kebenaran dimana nilai selain 0 adalah benar.

Contoh lain seleksi pada Python.
>>> L = []
>>> if L:
...     print 'list memiliki isi'
... else:
...     print 'list kosong'
...
list kosong
>>> L = [1,2,3]
>>> if L :
...     print 'list memiliki isi'
... else:
...     print 'list kosong'
...

Dan hasilnya sebagai berikut.


 Contoh ini juga menggambarkan bahwa segala sesuatu yang kosong, bernilai 0, akan bernilai salah pada saat dilakukan tes dengan if.

Contoh lain penggunaan seleksi pada Python.

>>> x = 1
>>> if 0
...     print 'x berada di antara 0 dan 5'
... else:
...     print 'x tidak berada di antara 0 dan 5'
...

Dan hasilnya sebagai berikut:


Contoh ini mengilustrasikan range. Ekspresi 0<x<5 mungkin terlihat asing bagi anda yang baru kali ini berkenalan dengan python, tetapi pasti terasa akrab oleh pengemar matematika. Setelah kita memperhatikan contoh-contoh penggunaan if, kita akan mensimulasikan penguunaan switch pada bahasa C. Kita memiliki dua cara, cara yang pertama bisa melakukannya dengan pasangan if/elif/else. Untuk cara kedua, kita bisa melakukannya dengan dictionary:

>>> pilihan = {'makan':'ambil perlengkapan makan, ambil makanan, terus makan',
...             'minum':'ambil gelas, ambil minuman, terus minum',
...             'tidur':'boleh langsung tidur dimana aja kalo mau'}
>>> kondisi='makan'
>>> pilihan[kondisi]

Dan hasilnya sebagai berikut:



Daftar Pustaka : “Python dan Pemograman Linux” pengarang Noprianto