mtsql 1.12.32__py3-none-any.whl → 1.12.34__py3-none-any.whl

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.
mt/sql/base.py CHANGED
@@ -25,12 +25,14 @@ __all__ = [
25
25
  "list_views",
26
26
  "table_exists",
27
27
  "create_temp_id_table",
28
+ "create_temp_id_tuple_table",
28
29
  "create_temp_str_id_table",
29
30
  "temp_table_name",
30
31
  "temp_table_find_new_id",
31
32
  "temp_table_drop",
32
33
  "to_temp_table",
33
34
  "find_common_ids",
35
+ "find_common_id_tuples",
34
36
  "find_common_str_ids",
35
37
  "remove_records_by_id",
36
38
  "remove_records_by_str_id",
@@ -423,6 +425,65 @@ def create_temp_id_table(
423
425
  return table_name
424
426
 
425
427
 
428
+ def create_temp_id_tuple_table(
429
+ la_ids: list,
430
+ n_cols: int,
431
+ conn: sa.engine.Connection,
432
+ int_type: str = "int",
433
+ chunksize: int = 1000000,
434
+ logger: tp.Optional[logg.IndentedLoggerAdapter] = None,
435
+ ) -> str:
436
+ """Creates a temporary table to containing a list of multi-column ids.
437
+
438
+ Parameters
439
+ ----------
440
+ la_ids : list
441
+ list of fixed-sized arrays of ids to be inserted into the table. Each array must have
442
+ length equal to `n_cols`.
443
+ n_cols : int
444
+ number of columns in the id arrays
445
+ conn : sqlalchemy.engine.Connection
446
+ a connection that has been opened
447
+ int_type : str
448
+ an SQL string representing the int type
449
+ chunksize : int
450
+ maximum number of ids to be inserted in each INSERT statement
451
+ logger : mt.logg.IndentedLoggerAdapter, optional
452
+ logger for debugging
453
+
454
+ Returns
455
+ -------
456
+ table_name : str
457
+ name of the temporary table. The table will be deleted at the end of the connection
458
+ """
459
+
460
+ if n_cols <= 1:
461
+ raise ValueError("n_cols must be greater than 1")
462
+
463
+ table_name = f"tab_{uuid.uuid4().hex}"
464
+
465
+ query_str = f"CREATE TEMP TABLE {table_name}("
466
+ query_str += ",".join((f"id{i+1} {int_type}" for i in range(n_cols)))
467
+ query_str += ");"
468
+ exec_sql(sa.text(query_str), conn, logger=logger)
469
+
470
+ while True:
471
+ la_ids2 = la_ids[:chunksize]
472
+ if len(la_ids2) == 0:
473
+ break
474
+ values = ",".join(
475
+ "(" + ",".join((str(id[i]) for i in range(n_cols))) + ")" for id in la_ids2
476
+ )
477
+ query_str = f"INSERT INTO {table_name}("
478
+ query_str += ",".join((f"id{i+1}" for i in range(n_cols)))
479
+ query_str += f") VALUES {values};"
480
+ exec_sql(sa.text(query_str), conn, logger=logger)
481
+
482
+ la_ids = la_ids[chunksize:]
483
+
484
+ return table_name
485
+
486
+
426
487
  def create_temp_str_id_table(
427
488
  l_ids: list,
428
489
  conn: sa.engine.Connection,
@@ -596,6 +657,64 @@ def find_common_ids(
596
657
  return l_commonIds
597
658
 
598
659
 
660
+ def find_common_id_tuples(
661
+ la_ids: tp.List[tp.List[int]],
662
+ l_idCols: tp.List[str],
663
+ frame_name: str,
664
+ engine: sa.engine.Engine,
665
+ schema: tp.Optional[str] = None,
666
+ int_type: str = "int",
667
+ logger: tp.Optional[logg.IndentedLoggerAdapter] = None,
668
+ ) -> tp.List[int]:
669
+ """Finds common ids between a list of ids and the ids in a given frame.
670
+
671
+ Parameters
672
+ ----------
673
+ la_ids : list of list of int
674
+ list of id tuples to be checked
675
+ l_idCols : list of str
676
+ name of the id columns in the frame
677
+ frame_name : str
678
+ name of the frame to be checked against
679
+ engine : sqlalchemy.engine.Engine
680
+ connection engine to the server
681
+ schema : str, optional
682
+ schema of the frame. If None, the default schema is used.
683
+ l_idCols : list of str
684
+ name of the id column in the frame
685
+ int_type : str
686
+ an SQL string representing the int type of the id column
687
+ logger : mt.logg.IndentedLoggerAdapter, optional
688
+ logger for debugging
689
+
690
+ Returns
691
+ -------
692
+ list of list of int
693
+ list of cpommon id tuples
694
+ """
695
+
696
+ with conn_ctx(engine) as conn:
697
+ temp_table = create_temp_id_tuple_table(
698
+ la_ids, conn, int_type=int_type, logger=logger
699
+ )
700
+
701
+ full_frame_name = frame_sql(frame_name, schema=schema)
702
+
703
+ sql = "SELECT t.id1"
704
+ for i in range(1, len(l_idCols)):
705
+ sql += f", t.id{i+1}"
706
+ sql += f" FROM {temp_table} AS t INNER JOIN {full_frame_name} AS f ON "
707
+ sql += " AND ".join(
708
+ (f"t.id{i+1} = f.{l_idCols[i]}" for i in range(len(l_idCols)))
709
+ )
710
+ sql += ";"
711
+
712
+ df_common = read_sql(sql, conn, index_col=None, logger=logger)
713
+ la_commonIds = df_common.to_numpy()
714
+
715
+ return la_commonIds
716
+
717
+
599
718
  def find_common_str_ids(
600
719
  l_ids: tp.List[str],
601
720
  frame_name: str,
mt/sql/version.py CHANGED
@@ -1,5 +1,5 @@
1
1
  MAJOR_VERSION = 1
2
2
  MINOR_VERSION = 12
3
- PATCH_VERSION = 32
3
+ PATCH_VERSION = 34
4
4
  version = '{}.{}.{}'.format(MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION)
5
5
  __all__ = ['MAJOR_VERSION', 'MINOR_VERSION', 'PATCH_VERSION', 'version']
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtsql
3
- Version: 1.12.32
3
+ Version: 1.12.34
4
4
  Summary: Extra Python modules to deal with the interaction between pandas dataframes and remote SQL servers, for Minh-Tri Pham
5
5
  Home-page: https://github.com/inteplus/mtsql
6
6
  Author: Minh-Tri Pham
@@ -12,8 +12,8 @@ Requires-Dist: tzlocal
12
12
  Requires-Dist: tqdm
13
13
  Requires-Dist: psycopg[binary]
14
14
  Requires-Dist: redshift_connector>=2.1.5
15
- Requires-Dist: mtbase>=4.3.2
16
- Requires-Dist: mtpandas>=1.17.16
15
+ Requires-Dist: mtbase>=4.33.15
16
+ Requires-Dist: mtpandas>=1.17.20
17
17
  Dynamic: author
18
18
  Dynamic: home-page
19
19
  Dynamic: license-file
@@ -1,17 +1,17 @@
1
1
  mt/sql/__init__.py,sha256=b7zO50apZxt9Hg2eOkJhRLrXgACR8eS5b-Rphdn5qNQ,44
2
- mt/sql/base.py,sha256=kCJCLHbxO0wI7Mmx7VrCtDGcjd01_vuOfuK2XuXd5SE,20398
2
+ mt/sql/base.py,sha256=14A2MOcplaG-lxw3XQTgJ-_y87UnlmNm-I_ky8BNAtU,24079
3
3
  mt/sql/mysql.py,sha256=n2ENDctdUqZuSaDAcrqZYtPtawq3Wx4dOPCRsCB5Q4w,4894
4
4
  mt/sql/psql.py,sha256=U8XEyg4rQYr5gm8KohRWrpCNJKl5WC1yxJMBkkm1k_A,68125
5
5
  mt/sql/sqlite.py,sha256=T2ak_hhNi_zRfpg_gp8JhNHn7D2kl4i-Ey6-9ANMtz0,8678
6
- mt/sql/version.py,sha256=38xiRL1MFfoE8EAiIn2HKJfyUv857BOba8101AxPUkM,208
6
+ mt/sql/version.py,sha256=D8EuKl4A40wQJkMyBQiik7J1LrO2sZafFCP-ODaRri4,208
7
7
  mt/sql/redshift/__init__.py,sha256=S-eRxJWcrvncF7LZXuulCdPV-UERu9eiw6uyDb5aGsM,443
8
8
  mt/sql/redshift/commands.py,sha256=xhGUBf3bL66EYdZI5HCUtOx-XqPCnXT_P-LnhPgtzrY,40193
9
9
  mt/sql/redshift/ddl.py,sha256=eUcZj9oIajiE1wKKBAP-V64gYJ7cVnSAt8dLFfluOJA,9777
10
10
  mt/sql/redshift/dialect.py,sha256=-0JjJubZZHRw0abhl6H6rKWaUE9pKtGwAuX-62T0e_c,53399
11
11
  mt/sql/redshift/main.py,sha256=H8_5sjtJ7dzWoCMXzPNjYhrMQ18eLUQ9xg-aYl5QeTc,17104
12
12
  mt/sql/redshift/redshift-ca-bundle.crt,sha256=532qYkOpQOstFE0mdXE1GVtL3v00XDKgZNTr6gK5-KE,8621
13
- mtsql-1.12.32.dist-info/licenses/LICENSE,sha256=PojkRlQzTT5Eg6Nj03XoIVEefN3u8iiIFf1p4rqe_t4,1070
14
- mtsql-1.12.32.dist-info/METADATA,sha256=mDrQHEVcsBSQ0_Clr-aMOW2aqIOWcCAf7RzPYvzmG9I,734
15
- mtsql-1.12.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
- mtsql-1.12.32.dist-info/top_level.txt,sha256=WcqGFu9cV7iMZg09iam8eNxUvGpLSKKF2Iubf6SJVOo,3
17
- mtsql-1.12.32.dist-info/RECORD,,
13
+ mtsql-1.12.34.dist-info/licenses/LICENSE,sha256=PojkRlQzTT5Eg6Nj03XoIVEefN3u8iiIFf1p4rqe_t4,1070
14
+ mtsql-1.12.34.dist-info/METADATA,sha256=JQ9YIrA80S3RHI0I0hPIfI7tA_qVL_6slJX0uu7nVQA,736
15
+ mtsql-1.12.34.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
16
+ mtsql-1.12.34.dist-info/top_level.txt,sha256=WcqGFu9cV7iMZg09iam8eNxUvGpLSKKF2Iubf6SJVOo,3
17
+ mtsql-1.12.34.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5