muaradata 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2024 REDIAN BARQY M
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,333 @@
1
+ Metadata-Version: 2.4
2
+ Name: muaradata
3
+ Version: 1.0.0
4
+ Summary: Pustaka Python untuk koneksi multi-database dengan fitur auto-retry dan SSH tunneling.
5
+ Author: Redian Barqy M
6
+ Author-email: rbm.eki@gmail.com
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Operating System :: OS Independent
10
+ Requires-Python: >=3.7
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: pandas
14
+ Requires-Dist: numpy
15
+ Requires-Dist: psycopg2-binary
16
+ Requires-Dist: clickhouse-driver
17
+ Requires-Dist: clickhouse-connect
18
+ Requires-Dist: mysql-connector-python
19
+ Requires-Dist: sshtunnel
20
+ Requires-Dist: tqdm
21
+ Requires-Dist: rich
22
+ Requires-Dist: tabulate
23
+ Requires-Dist: cryptography
24
+ Requires-Dist: platformdirs
25
+ Dynamic: author
26
+ Dynamic: author-email
27
+ Dynamic: classifier
28
+ Dynamic: description
29
+ Dynamic: description-content-type
30
+ Dynamic: license-file
31
+ Dynamic: requires-dist
32
+ Dynamic: requires-python
33
+ Dynamic: summary
34
+
35
+ # ๐Ÿ“š MUARA DATA
36
+
37
+ ![Python](https://img.shields.io/badge/python-3.7%2B-blue)
38
+ ![License](https://img.shields.io/badge/license-MIT-green)
39
+
40
+ **MUARA DATA** adalah pustaka Python yang memudahkan Anda **terhubung ke berbagai jenis database (ex. ClickHouse dan PostgreSQL)**, menjalankan query dengan **retry otomatis**, serta **memasukkan data DataFrame ke database** dengan konversi tipe data otomatis.
41
+
42
+ ---
43
+
44
+ ## โšก๏ธ Fitur Utama
45
+
46
+ ๐Ÿ”€ **Multi-Database Support**
47
+ Mendukung koneksi ke **ClickHouse**, **PostgreSQL**, dan **MySQL** melalui satu antarmuka sederhana.
48
+
49
+ ๐Ÿ”„ **Retry Mechanism Otomatis**
50
+ Menangani gangguan koneksi dengan retry berulang tanpa menghentikan proses utama.
51
+
52
+ ๐Ÿ“ฅ **Insert Data Otomatis**
53
+ Mendukung konversi tipe data (float, int, string, array, datetime) dan opsi truncate sebelum insert.
54
+
55
+ ๐Ÿ›ก๏ธ **Secure SSH Tunneling**
56
+ Mendukung koneksi aman ke database di jaringan privat melalui **SSH Tunnel** (Bastion Host) dengan autentikasi kata sandi maupun SSH key.
57
+
58
+ โš™๏ธ **Konfigurasi Fleksibel**
59
+ Semua koneksi dikelola melalui file terenkripsi, tanpa perlu hard-code credential di kode.
60
+
61
+ ๐Ÿ”‘ **Credential Manager**
62
+ Kelola kredensial database dengan aman dan cepat langsung melalui terminal menggunakan Credential Manager.
63
+
64
+ ---
65
+
66
+ ## ๐Ÿงฉ Instalasi
67
+
68
+ ### 1. Install Muara Data
69
+ ```bash
70
+ pip install muaradata
71
+ ```
72
+
73
+ ### 2. Daftarkan Credential Database
74
+ Jalankan perintah ```muaradb``` melalui terminal atau command-line.
75
+
76
+ Saat pertama kali dijalankan, aplikasi akan otomatis membuat:
77
+
78
+ - File `users.enc` dengan akun admin default
79
+ - File `credentials.enc` dengan contoh credential
80
+ - File `tunnels.enc` dengan contoh tunnel
81
+ - File `.key` untuk masing-masing file terenkripsi
82
+
83
+ #### Login Awal
84
+
85
+ ```text
86
+ Username : admin
87
+ Password : Admin123!
88
+ ```
89
+ > โš ๏ธ Sangat disarankan untuk segera mengganti password admin default
90
+ > setelah login pertama.
91
+
92
+ ---
93
+
94
+ ## Quick Start
95
+ ```python
96
+ from muaradata import fetch_data
97
+
98
+ df = fetch_data("SELECT 1", aim="iriis_ch")
99
+ ```
100
+
101
+ ---
102
+
103
+ ## ๐Ÿš€ Cara Penggunaan
104
+
105
+ ### ๐Ÿ”น Import Library
106
+ ```python
107
+ from muaradata import fetch_data, exec_query, insert_data, generate_table
108
+ ```
109
+
110
+ ---
111
+
112
+ ## ๐Ÿ› ๏ธ Fungsionalitas Utama
113
+
114
+ ### 1. Menjalankan Query (`fetch_data`)
115
+ Menjalankan perintah SQL dan mengembalikan hasil sebagai `pandas.DataFrame`.
116
+
117
+ ```python
118
+ df = fetch_data(
119
+ query="SELECT * FROM sandbox.test_insert",
120
+ aim="iriis_ch",
121
+ retry_delay=10,
122
+ max_retries=20
123
+ )
124
+ ```
125
+
126
+ **Parameter:**
127
+ | Nama | Tipe | Default | Deskripsi |
128
+ |------|------|----------|------------|
129
+ | `query` | `str` | โ€” | Perintah SQL yang akan dijalankan |
130
+ | `aim` | `str` | โ€” | Nama koneksi sesuai `credentials` |
131
+ | `engine` | โ€” | `None` | Objek koneksi database (optional) |
132
+ | `retry_delay` | `int` | `10` | Waktu tunggu antar percobaan koneksi (detik) (optional) |
133
+ | `max_retries` | `int` | `20` | Jumlah maksimum percobaan koneksi ulang (optional) |
134
+
135
+ ---
136
+
137
+ ### 2. Menjalankan Query Eksekusi (`exec_query`)
138
+ Digunakan untuk query yang **tidak mengembalikan data**, seperti `INSERT`, `UPDATE`, atau `DELETE`.
139
+
140
+ ```python
141
+ result = exec_query("DELETE FROM sandbox.test_insert WHERE id = 10", aim="iriis_pg")
142
+ print(result) # "Query Executed Successfully"
143
+ ```
144
+
145
+ ---
146
+
147
+ ### 3. Menyimpan Data ke Database (`insert_data`)
148
+ Fungsi insert_data digunakan untuk menyisipkan data dari sebuah DataFrame ke dalam database seperti ClickHouse atau PostgreSQL. Fungsi ini mendukung konversi tipe data secara otomatis berdasarkan definisi kolom yang diberikan melalui parameter kolom.
149
+
150
+ ```python
151
+ insert_data(
152
+ result=df,
153
+ aim='database_prod',
154
+ nama_table='site.test_insert',
155
+ kolom=kolom,
156
+ truncate=False
157
+ )
158
+ ```
159
+
160
+ Contoh struktur parameter kolom:
161
+ ```python
162
+ kolom = {
163
+ 'all': ['id', 'nama', 'alamat'], # Daftar semua kolom yang akan disisipkan
164
+ 'float': [], # Kolom bertipe float
165
+ 'integer': ['id'], # Kolom bertipe integer
166
+ 'string': ['nama', 'alamat'], # Kolom bertipe string
167
+ 'array': ['combination_band'], # Kolom bertipe array
168
+ 'datetime': [] # Kolom bertipe datetime
169
+ }
170
+
171
+ ```
172
+ > Jika tidak ada kolom untuk tipe tertentu, daftar dapat dikosongkan. Struktur ini memungkinkan konversi tipe data yang konsisten sebelum data dimasukkan ke dalam tabel database.
173
+
174
+ **Parameter:**
175
+ | Nama | Tipe | Deskripsi |
176
+ |------|------|------------|
177
+ | `result` | `DataFrame` | Data yang akan disimpan |
178
+ | `nama_table` | `str` | Nama tabel |
179
+ | `aim` | `str` | Nama koneksi database |
180
+ | `kolom` | `dict` | Struktur kolom dan tipe datanya, tulis `auto` akan menyesuaikan dengan struktur dataframe |
181
+ | `truncate` | `bool` | Jika `True`, tabel akan dikosongkan sebelum insert (optional) |
182
+
183
+ **๐Ÿ’ก Tips:**
184
+ > - Parameter `nama_table` harus diisi dengan nama tabel lengkap beserta schema-nya (misalnya: `schema.nama_tabel`).
185
+ > - Jika kedua parameter diisi, maka proses akan dilakukan pada kedua database secara bersamaan **dengan syarat** struktur tabel pada kedua database **identik**.
186
+ > - Jika struktur tabel berbeda, maka pemanggilan fungsi harus dilakukan secara terpisah untuk masing-masing database.
187
+
188
+ ```python
189
+ # Contoh pemanggilan fungsi secara terpisah
190
+
191
+ kolom_tabel1 = {
192
+ 'all': [],
193
+ 'float': [],
194
+ 'integer': [],
195
+ 'string': [],
196
+ 'datetime': []
197
+ }
198
+ insert_data(
199
+ result=df,
200
+ aim='database_dev',
201
+ nama_table='sandbox.test_insert',
202
+ kolom=kolom_tabel,
203
+ truncate=False
204
+ )
205
+
206
+ kolom_tabel2 = {
207
+ 'all': [],
208
+ 'float': [],
209
+ 'integer': [],
210
+ 'string': [],
211
+ 'datetime': []
212
+ }
213
+ insert_data(
214
+ result=df,
215
+ aim='database_prod',
216
+ nama_table='site.test_insert',
217
+ kolom=kolom_tabel2,
218
+ truncate=True
219
+ )
220
+ ```
221
+
222
+ ---
223
+
224
+ ### 4. Membuat Table (`generate_table`)
225
+
226
+ Fungsi `generate_table` digunakan untuk membuat perintah DDL (Data Definition Language) secara otomatis berdasarkan struktur dan tipe data yang terdapat dalam objek `pandas.DataFrame`. Perintah DDL yang dihasilkan akan disesuaikan dengan format tipe data yang sesuai untuk masing-masing database, dan kemudian dijalankan untuk membuat tabel secara langsung.
227
+
228
+ > Catatan: Pastikan struktur `DataFrame` telah sesuai dengan kebutuhan skema tabel sebelum menjalankan fungsi ini
229
+
230
+
231
+ **Parameter:**
232
+ | Nama | Tipe | Default | Deskripsi |
233
+ |------|------|----------|------------|
234
+ | `df` | `DataFrame` | - | Data yang akan dibuatkan tabel dan disimpan |
235
+ | `aim` | `str` | - | Nama koneksi database |
236
+ | `nama_table` | `str` | - | Nama tabel yang akan dibuat |
237
+ | `drop_table` | `str` | `True` | Menghapus table jika sudah ada didalam database |
238
+ | `ingest_data` | `bool` | `True` | Proses pengisian data ke dalam tabel setelah pembuatan |
239
+ | `**kwargs` | `str` | - | Parameter tambahan yang diteruskan ke generator.generate() untuk kedua driver (misal engine, order_by untuk ClickHouse MergeTree; schema, dtype untuk PostgreSQL). |
240
+
241
+ ```
242
+ Returns:
243
+ True jika proses selesai tanpa error.
244
+ ```
245
+ Contoh Penggunaan:
246
+
247
+ ```python
248
+ generate_table(
249
+ df,
250
+ aim='database_prod',
251
+ nama_table='default.sample_table',
252
+ ingest_data=True
253
+ )
254
+ ```
255
+ ### Informasi Tambahan
256
+
257
+ - **Parameter `ingest_data`**
258
+ Isi `ingest_data = False` jika tidak ingin langsung melakukan proses pengisian data ke dalam tabel setelah pembuatan.
259
+ ---
260
+
261
+ ### 4. Mirroring Table (`copy_table`)
262
+
263
+ Menyalin struktur tabel dari satu server ke server lain, lintas platform dan lintas database (PostgreSQL โ†” ClickHouse atau driver apapun yang terdaftar di REGISTRY).
264
+
265
+ Cara kerja:
266
+ > 1. Ambil sample baris dari tabel source untuk membaca struktur kolom dan tipe data (bukan full data, kecuali with_data=True).
267
+ > 2. Resolve driver destination dari kredensial aim_destination.
268
+ > 3. Buat tabel di destination via generate_table() dengan kolom yang
269
+ sudah dinormalisasi. Ingest data hanya jika with_data=True.
270
+ ```
271
+ Args:
272
+ nama_table_source: Nama tabel di server source, termasuk schema
273
+ jika diperlukan. Contoh: "public.tx_ticket".
274
+ aim_source: Alias koneksi source yang terdaftar di credentials.
275
+ Contoh: "iriis_pg", "iriis_ch".
276
+ nama_table_destination: Nama tabel yang akan dibuat di server destination.
277
+ Contoh: "staging_area.tx_ticket".
278
+ aim_destination: Alias koneksi destination.
279
+ Contoh: "iriis_ch", "iriis_pg".
280
+ drop_table: Jika True, tabel destination di-drop & dibuat ulang
281
+ jika sudah ada. Default: True.
282
+ with_data: Jika True, data sample juga ikut dimasukkan ke
283
+ tabel destination setelah struktur dibuat.
284
+ Jika False, hanya struktur yang disalin. Default: False.
285
+ sample_rows: Jumlah baris yang diambil dari source untuk membaca
286
+ struktur. Nilai lebih besar membantu deteksi tipe kolom
287
+ yang lebih akurat (misal kolom dengan banyak NULL).
288
+ Default: 100.
289
+ **kwargs: Parameter tambahan yang diteruskan ke generate_table()
290
+ (misal engine, order_by untuk ClickHouse MergeTree).
291
+ ```
292
+ ```
293
+ Returns:
294
+ True jika proses selesai tanpa error.
295
+ ```
296
+ ```
297
+ Raises:
298
+ ValueError: Jika driver destination tidak dikenali atau tidak didukung.
299
+ Exception: Meneruskan exception dari fetch_data / generate_table.
300
+ ```
301
+ Contoh penggunaan:
302
+ ```
303
+ from muaradata import copy_table
304
+
305
+ # Salin struktur saja, dari PostgreSQL ke ClickHouse
306
+ copy_table("public.tx_ticket", "db_source", "staging_area.tx_ticket", "db_staging")
307
+
308
+ # Salin struktur + data sample, dari ClickHouse ke PostgreSQL
309
+ copy_table(
310
+ "staging_area.tx_ticket", "db_source",
311
+ "public.tx_ticket", "db_staging",
312
+ with_data=True,
313
+ sample_rows=500,
314
+ )
315
+
316
+ # Salin antar ClickHouse dengan opsi engine khusus
317
+ copy_table(
318
+ "db_a.tx_ticket", "ch_server_a",
319
+ "db_b.tx_ticket", "ch_server_b",
320
+ engine="MergeTree()",
321
+ order_by="id",
322
+ )
323
+ ```
324
+ ---
325
+
326
+ ## ๐Ÿงพ Lisensi & Informasi
327
+
328
+ **Author :** Redian Barqy Muhammad
329
+ **Email :** rbm.eki@gmail.com
330
+ **Copyright :** ยฉ 2025 MuaraData Project
331
+
332
+
333
+ MIT License
@@ -0,0 +1,299 @@
1
+ # ๐Ÿ“š MUARA DATA
2
+
3
+ ![Python](https://img.shields.io/badge/python-3.7%2B-blue)
4
+ ![License](https://img.shields.io/badge/license-MIT-green)
5
+
6
+ **MUARA DATA** adalah pustaka Python yang memudahkan Anda **terhubung ke berbagai jenis database (ex. ClickHouse dan PostgreSQL)**, menjalankan query dengan **retry otomatis**, serta **memasukkan data DataFrame ke database** dengan konversi tipe data otomatis.
7
+
8
+ ---
9
+
10
+ ## โšก๏ธ Fitur Utama
11
+
12
+ ๐Ÿ”€ **Multi-Database Support**
13
+ Mendukung koneksi ke **ClickHouse**, **PostgreSQL**, dan **MySQL** melalui satu antarmuka sederhana.
14
+
15
+ ๐Ÿ”„ **Retry Mechanism Otomatis**
16
+ Menangani gangguan koneksi dengan retry berulang tanpa menghentikan proses utama.
17
+
18
+ ๐Ÿ“ฅ **Insert Data Otomatis**
19
+ Mendukung konversi tipe data (float, int, string, array, datetime) dan opsi truncate sebelum insert.
20
+
21
+ ๐Ÿ›ก๏ธ **Secure SSH Tunneling**
22
+ Mendukung koneksi aman ke database di jaringan privat melalui **SSH Tunnel** (Bastion Host) dengan autentikasi kata sandi maupun SSH key.
23
+
24
+ โš™๏ธ **Konfigurasi Fleksibel**
25
+ Semua koneksi dikelola melalui file terenkripsi, tanpa perlu hard-code credential di kode.
26
+
27
+ ๐Ÿ”‘ **Credential Manager**
28
+ Kelola kredensial database dengan aman dan cepat langsung melalui terminal menggunakan Credential Manager.
29
+
30
+ ---
31
+
32
+ ## ๐Ÿงฉ Instalasi
33
+
34
+ ### 1. Install Muara Data
35
+ ```bash
36
+ pip install muaradata
37
+ ```
38
+
39
+ ### 2. Daftarkan Credential Database
40
+ Jalankan perintah ```muaradb``` melalui terminal atau command-line.
41
+
42
+ Saat pertama kali dijalankan, aplikasi akan otomatis membuat:
43
+
44
+ - File `users.enc` dengan akun admin default
45
+ - File `credentials.enc` dengan contoh credential
46
+ - File `tunnels.enc` dengan contoh tunnel
47
+ - File `.key` untuk masing-masing file terenkripsi
48
+
49
+ #### Login Awal
50
+
51
+ ```text
52
+ Username : admin
53
+ Password : Admin123!
54
+ ```
55
+ > โš ๏ธ Sangat disarankan untuk segera mengganti password admin default
56
+ > setelah login pertama.
57
+
58
+ ---
59
+
60
+ ## Quick Start
61
+ ```python
62
+ from muaradata import fetch_data
63
+
64
+ df = fetch_data("SELECT 1", aim="iriis_ch")
65
+ ```
66
+
67
+ ---
68
+
69
+ ## ๐Ÿš€ Cara Penggunaan
70
+
71
+ ### ๐Ÿ”น Import Library
72
+ ```python
73
+ from muaradata import fetch_data, exec_query, insert_data, generate_table
74
+ ```
75
+
76
+ ---
77
+
78
+ ## ๐Ÿ› ๏ธ Fungsionalitas Utama
79
+
80
+ ### 1. Menjalankan Query (`fetch_data`)
81
+ Menjalankan perintah SQL dan mengembalikan hasil sebagai `pandas.DataFrame`.
82
+
83
+ ```python
84
+ df = fetch_data(
85
+ query="SELECT * FROM sandbox.test_insert",
86
+ aim="iriis_ch",
87
+ retry_delay=10,
88
+ max_retries=20
89
+ )
90
+ ```
91
+
92
+ **Parameter:**
93
+ | Nama | Tipe | Default | Deskripsi |
94
+ |------|------|----------|------------|
95
+ | `query` | `str` | โ€” | Perintah SQL yang akan dijalankan |
96
+ | `aim` | `str` | โ€” | Nama koneksi sesuai `credentials` |
97
+ | `engine` | โ€” | `None` | Objek koneksi database (optional) |
98
+ | `retry_delay` | `int` | `10` | Waktu tunggu antar percobaan koneksi (detik) (optional) |
99
+ | `max_retries` | `int` | `20` | Jumlah maksimum percobaan koneksi ulang (optional) |
100
+
101
+ ---
102
+
103
+ ### 2. Menjalankan Query Eksekusi (`exec_query`)
104
+ Digunakan untuk query yang **tidak mengembalikan data**, seperti `INSERT`, `UPDATE`, atau `DELETE`.
105
+
106
+ ```python
107
+ result = exec_query("DELETE FROM sandbox.test_insert WHERE id = 10", aim="iriis_pg")
108
+ print(result) # "Query Executed Successfully"
109
+ ```
110
+
111
+ ---
112
+
113
+ ### 3. Menyimpan Data ke Database (`insert_data`)
114
+ Fungsi insert_data digunakan untuk menyisipkan data dari sebuah DataFrame ke dalam database seperti ClickHouse atau PostgreSQL. Fungsi ini mendukung konversi tipe data secara otomatis berdasarkan definisi kolom yang diberikan melalui parameter kolom.
115
+
116
+ ```python
117
+ insert_data(
118
+ result=df,
119
+ aim='database_prod',
120
+ nama_table='site.test_insert',
121
+ kolom=kolom,
122
+ truncate=False
123
+ )
124
+ ```
125
+
126
+ Contoh struktur parameter kolom:
127
+ ```python
128
+ kolom = {
129
+ 'all': ['id', 'nama', 'alamat'], # Daftar semua kolom yang akan disisipkan
130
+ 'float': [], # Kolom bertipe float
131
+ 'integer': ['id'], # Kolom bertipe integer
132
+ 'string': ['nama', 'alamat'], # Kolom bertipe string
133
+ 'array': ['combination_band'], # Kolom bertipe array
134
+ 'datetime': [] # Kolom bertipe datetime
135
+ }
136
+
137
+ ```
138
+ > Jika tidak ada kolom untuk tipe tertentu, daftar dapat dikosongkan. Struktur ini memungkinkan konversi tipe data yang konsisten sebelum data dimasukkan ke dalam tabel database.
139
+
140
+ **Parameter:**
141
+ | Nama | Tipe | Deskripsi |
142
+ |------|------|------------|
143
+ | `result` | `DataFrame` | Data yang akan disimpan |
144
+ | `nama_table` | `str` | Nama tabel |
145
+ | `aim` | `str` | Nama koneksi database |
146
+ | `kolom` | `dict` | Struktur kolom dan tipe datanya, tulis `auto` akan menyesuaikan dengan struktur dataframe |
147
+ | `truncate` | `bool` | Jika `True`, tabel akan dikosongkan sebelum insert (optional) |
148
+
149
+ **๐Ÿ’ก Tips:**
150
+ > - Parameter `nama_table` harus diisi dengan nama tabel lengkap beserta schema-nya (misalnya: `schema.nama_tabel`).
151
+ > - Jika kedua parameter diisi, maka proses akan dilakukan pada kedua database secara bersamaan **dengan syarat** struktur tabel pada kedua database **identik**.
152
+ > - Jika struktur tabel berbeda, maka pemanggilan fungsi harus dilakukan secara terpisah untuk masing-masing database.
153
+
154
+ ```python
155
+ # Contoh pemanggilan fungsi secara terpisah
156
+
157
+ kolom_tabel1 = {
158
+ 'all': [],
159
+ 'float': [],
160
+ 'integer': [],
161
+ 'string': [],
162
+ 'datetime': []
163
+ }
164
+ insert_data(
165
+ result=df,
166
+ aim='database_dev',
167
+ nama_table='sandbox.test_insert',
168
+ kolom=kolom_tabel,
169
+ truncate=False
170
+ )
171
+
172
+ kolom_tabel2 = {
173
+ 'all': [],
174
+ 'float': [],
175
+ 'integer': [],
176
+ 'string': [],
177
+ 'datetime': []
178
+ }
179
+ insert_data(
180
+ result=df,
181
+ aim='database_prod',
182
+ nama_table='site.test_insert',
183
+ kolom=kolom_tabel2,
184
+ truncate=True
185
+ )
186
+ ```
187
+
188
+ ---
189
+
190
+ ### 4. Membuat Table (`generate_table`)
191
+
192
+ Fungsi `generate_table` digunakan untuk membuat perintah DDL (Data Definition Language) secara otomatis berdasarkan struktur dan tipe data yang terdapat dalam objek `pandas.DataFrame`. Perintah DDL yang dihasilkan akan disesuaikan dengan format tipe data yang sesuai untuk masing-masing database, dan kemudian dijalankan untuk membuat tabel secara langsung.
193
+
194
+ > Catatan: Pastikan struktur `DataFrame` telah sesuai dengan kebutuhan skema tabel sebelum menjalankan fungsi ini
195
+
196
+
197
+ **Parameter:**
198
+ | Nama | Tipe | Default | Deskripsi |
199
+ |------|------|----------|------------|
200
+ | `df` | `DataFrame` | - | Data yang akan dibuatkan tabel dan disimpan |
201
+ | `aim` | `str` | - | Nama koneksi database |
202
+ | `nama_table` | `str` | - | Nama tabel yang akan dibuat |
203
+ | `drop_table` | `str` | `True` | Menghapus table jika sudah ada didalam database |
204
+ | `ingest_data` | `bool` | `True` | Proses pengisian data ke dalam tabel setelah pembuatan |
205
+ | `**kwargs` | `str` | - | Parameter tambahan yang diteruskan ke generator.generate() untuk kedua driver (misal engine, order_by untuk ClickHouse MergeTree; schema, dtype untuk PostgreSQL). |
206
+
207
+ ```
208
+ Returns:
209
+ True jika proses selesai tanpa error.
210
+ ```
211
+ Contoh Penggunaan:
212
+
213
+ ```python
214
+ generate_table(
215
+ df,
216
+ aim='database_prod',
217
+ nama_table='default.sample_table',
218
+ ingest_data=True
219
+ )
220
+ ```
221
+ ### Informasi Tambahan
222
+
223
+ - **Parameter `ingest_data`**
224
+ Isi `ingest_data = False` jika tidak ingin langsung melakukan proses pengisian data ke dalam tabel setelah pembuatan.
225
+ ---
226
+
227
+ ### 4. Mirroring Table (`copy_table`)
228
+
229
+ Menyalin struktur tabel dari satu server ke server lain, lintas platform dan lintas database (PostgreSQL โ†” ClickHouse atau driver apapun yang terdaftar di REGISTRY).
230
+
231
+ Cara kerja:
232
+ > 1. Ambil sample baris dari tabel source untuk membaca struktur kolom dan tipe data (bukan full data, kecuali with_data=True).
233
+ > 2. Resolve driver destination dari kredensial aim_destination.
234
+ > 3. Buat tabel di destination via generate_table() dengan kolom yang
235
+ sudah dinormalisasi. Ingest data hanya jika with_data=True.
236
+ ```
237
+ Args:
238
+ nama_table_source: Nama tabel di server source, termasuk schema
239
+ jika diperlukan. Contoh: "public.tx_ticket".
240
+ aim_source: Alias koneksi source yang terdaftar di credentials.
241
+ Contoh: "iriis_pg", "iriis_ch".
242
+ nama_table_destination: Nama tabel yang akan dibuat di server destination.
243
+ Contoh: "staging_area.tx_ticket".
244
+ aim_destination: Alias koneksi destination.
245
+ Contoh: "iriis_ch", "iriis_pg".
246
+ drop_table: Jika True, tabel destination di-drop & dibuat ulang
247
+ jika sudah ada. Default: True.
248
+ with_data: Jika True, data sample juga ikut dimasukkan ke
249
+ tabel destination setelah struktur dibuat.
250
+ Jika False, hanya struktur yang disalin. Default: False.
251
+ sample_rows: Jumlah baris yang diambil dari source untuk membaca
252
+ struktur. Nilai lebih besar membantu deteksi tipe kolom
253
+ yang lebih akurat (misal kolom dengan banyak NULL).
254
+ Default: 100.
255
+ **kwargs: Parameter tambahan yang diteruskan ke generate_table()
256
+ (misal engine, order_by untuk ClickHouse MergeTree).
257
+ ```
258
+ ```
259
+ Returns:
260
+ True jika proses selesai tanpa error.
261
+ ```
262
+ ```
263
+ Raises:
264
+ ValueError: Jika driver destination tidak dikenali atau tidak didukung.
265
+ Exception: Meneruskan exception dari fetch_data / generate_table.
266
+ ```
267
+ Contoh penggunaan:
268
+ ```
269
+ from muaradata import copy_table
270
+
271
+ # Salin struktur saja, dari PostgreSQL ke ClickHouse
272
+ copy_table("public.tx_ticket", "db_source", "staging_area.tx_ticket", "db_staging")
273
+
274
+ # Salin struktur + data sample, dari ClickHouse ke PostgreSQL
275
+ copy_table(
276
+ "staging_area.tx_ticket", "db_source",
277
+ "public.tx_ticket", "db_staging",
278
+ with_data=True,
279
+ sample_rows=500,
280
+ )
281
+
282
+ # Salin antar ClickHouse dengan opsi engine khusus
283
+ copy_table(
284
+ "db_a.tx_ticket", "ch_server_a",
285
+ "db_b.tx_ticket", "ch_server_b",
286
+ engine="MergeTree()",
287
+ order_by="id",
288
+ )
289
+ ```
290
+ ---
291
+
292
+ ## ๐Ÿงพ Lisensi & Informasi
293
+
294
+ **Author :** Redian Barqy Muhammad
295
+ **Email :** rbm.eki@gmail.com
296
+ **Copyright :** ยฉ 2025 MuaraData Project
297
+
298
+
299
+ MIT License
@@ -0,0 +1,25 @@
1
+ from .api import (
2
+ fetch_data,
3
+ run_query,
4
+ exec_query,
5
+ run_exec,
6
+ insert_data,
7
+ generate_table,
8
+ copy_table,
9
+ # avail_data,
10
+ # test_connection,
11
+ )
12
+
13
+ __all__ = [
14
+ "fetch_data",
15
+ "run_query",
16
+ "exec_query",
17
+ "run_exec",
18
+ "insert_data",
19
+ "generate_table",
20
+ "copy_table",
21
+ # "avail_data",
22
+ # "test_connection",
23
+ ]
24
+
25
+ __version__ = "1.0.0"