dbhydra 2.2.5__py3-none-any.whl → 2.2.8__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.
dbhydra/dbhydra_core.py CHANGED
@@ -22,6 +22,9 @@ class Jsonable(str):
22
22
  """Is used as type in python_database_type_mapping"""
23
23
  pass
24
24
 
25
+ class BLOB(str):
26
+ """Store BLOBS up to 16MB."""
27
+ pass
25
28
 
26
29
 
27
30
  # dataframe - dictionary auxiliary functions
@@ -259,16 +259,19 @@ class AbstractTable(AbstractJoinable, abc.ABC):
259
259
 
260
260
 
261
261
  def drop(self, debug_mode = False):
262
- query = "DROP TABLE " + self.name
262
+ quote = self.db1.identifier_quote
263
+ query = f"DROP TABLE {quote}{self.name}{quote}"
263
264
  if debug_mode:
264
265
  print(query)
265
266
  self.execute(query)
266
267
 
267
268
  def update(self, variable_assign, where=None, debug_mode = False):
269
+ quote = self.db1.identifier_quote
268
270
  if where is None:
269
- query = "UPDATE " + self.name + " SET " + variable_assign
271
+ query = f"UPDATE {quote}{self.name}{quote} SET {quote}{variable_assign}{quote}"
270
272
  else:
271
- query = "UPDATE " + self.name + " SET " + variable_assign + " WHERE " + where
273
+ query = f"UPDATE {quote}{self.name}{quote} SET {quote}{variable_assign}{quote} WHERE {quote}{where}{quote}"
274
+
272
275
  if debug_mode:
273
276
  print(query)
274
277
  return self.execute(query)
@@ -303,25 +306,25 @@ class AbstractTable(AbstractJoinable, abc.ABC):
303
306
  for column_name, column_type in types_without_id_column
304
307
  ]
305
308
 
309
+ quote = self.db1.identifier_quote
306
310
  column_value_string = ""
307
311
  for column_name, cell_value, column_type in update_df_row_list:
308
312
  if cell_value is None:
309
- column_value_string += f"{column_name} = NULL, "
313
+ column_value_string += f"{quote}{column_name}{quote} = NULL, "
310
314
  elif column_type in ["double", "int", "tinyint"]:
311
- column_value_string += f"{column_name} = {cell_value}, "
315
+ column_value_string += f"{quote}{column_name}{quote} = {cell_value}, "
312
316
  elif "varchar" in column_type:
313
- column_value_string += f"{column_name} = '{cell_value}', "
317
+ column_value_string += f"{quote}{column_name}{quote} = '{cell_value}', "
314
318
  elif column_type in ["json", "text", "mediumtext", "longtext", "datetime"]:
315
- column_value_string += f"{column_name} = '{cell_value}', "
319
+ column_value_string += f"{quote}{column_name}{quote} = '{cell_value}', "
316
320
  else:
317
321
  raise AttributeError(f"Unknown column type '{column_type}'")
318
322
 
319
323
  column_value_string = column_value_string.rstrip(", ")
320
- quote = self.db1.identifier_quote
321
324
  sql_query = f"UPDATE {quote}{self.name}{quote} SET {column_value_string}"
322
325
 
323
326
  if where_column is not None and where_value is not None:
324
- sql_query += f" WHERE {where_column} = {where_value};"
327
+ sql_query += f" WHERE {quote}{where_column}{quote} = {where_value};"
325
328
  else:
326
329
  sql_query += ";"
327
330
  if debug_mode:
@@ -382,7 +385,7 @@ class AbstractTable(AbstractJoinable, abc.ABC):
382
385
  inserted_columns=list(dict.fromkeys(self.columns)) #DEDUPLICATION preserving order -> better than inserted_columns = set(self.columns)
383
386
  id_index=inserted_columns.index(self.id_column_name)
384
387
  inserted_columns.pop(id_index)
385
- print(inserted_columns,df.columns)
388
+ # print(inserted_columns,df.columns)
386
389
 
387
390
  assert set(df.columns) == set(inserted_columns) #elements are matchin
388
391
  #df = df[inserted_columns]
@@ -400,7 +403,8 @@ class AbstractTable(AbstractJoinable, abc.ABC):
400
403
 
401
404
  # TODO: handling nan values -> change to NULL
402
405
  for column in list(df.columns):
403
- df.loc[pd.isna(df[column]), column] = "NULL"
406
+
407
+ df[column] = df[column].fillna("NULL") #New implementation, Old implementation was deprecated by pandas: #df.loc[pd.isna(df[column]), column] = "NULL"
404
408
 
405
409
  # rows = df.values.tolist()
406
410
  # for i, row in enumerate(rows):
@@ -428,12 +432,7 @@ class AbstractTable(AbstractJoinable, abc.ABC):
428
432
  quote = self.db1.identifier_quote
429
433
 
430
434
  if where is None:
431
- query = "DELETE FROM {quote}{self.name}{quote}"
435
+ query = f"DELETE FROM {quote}{self.name}{quote}"
432
436
  else:
433
437
  query = f"DELETE FROM {quote}{self.name}{quote} WHERE {where}"
434
438
  return self.execute(query)
435
-
436
-
437
-
438
-
439
-
dbhydra/src/mysql_db.py CHANGED
@@ -19,7 +19,8 @@ class MysqlDb(AbstractDb):
19
19
  'dict': "nvarchar(2047)",
20
20
  'bool': "tinyint",
21
21
  'datetime': "datetime",
22
- 'Jsonable': "json"
22
+ 'Jsonable': "json",
23
+ 'BLOB': "mediumblob",
23
24
  }
24
25
 
25
26
  def __init__(self, *args, **kwargs):
dbhydra/src/tables.py CHANGED
@@ -5,9 +5,9 @@ import abc
5
5
  import time
6
6
  #xlsx imports
7
7
  import pathlib
8
-
8
+ import pymysql
9
9
  from dbhydra.src.abstract_table import AbstractTable, AbstractSelectable, AbstractJoinable
10
-
10
+ import binascii
11
11
 
12
12
  MONGO_OPERATOR_DICT = {"=": "$eq", ">": "$gt", ">=": "$gte", " IN ": "$in", "<": "$lt", "<=": "$lte", "<>": "$ne"}
13
13
 
@@ -294,11 +294,12 @@ class BigQueryTable(AbstractSelectable):
294
294
  return column_names, column_types
295
295
 
296
296
 
297
- def select(self, query):
297
+ def select(self, query, debug_mode = False):
298
298
 
299
299
  """given SELECT query returns Python list"""
300
300
  """Columns give the number of selected columns"""
301
- print(query)
301
+ if debug_mode:
302
+ print(query)
302
303
  # rows = self.db1.client.query(query).result()
303
304
  rows = self.db1.execute(query)
304
305
  return rows
@@ -806,7 +807,10 @@ class MysqlTable(AbstractTable):
806
807
  query += "'" + str(rows[k][j]) + "',"
807
808
  elif "json" in self.types[j + start_index]:
808
809
  query += f"'{rows[k][j]}', "
809
-
810
+ elif 'blob' in self.types[j + start_index]:
811
+ # Convert to hex to allow insertion into SQL query
812
+ hex_data = binascii.hexlify(rows[k][j]).decode('ascii')
813
+ query += f"UNHEX('{hex_data}'), "
810
814
 
811
815
  else:
812
816
  query += str(rows[k][j]) + ","
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbhydra
3
- Version: 2.2.5
3
+ Version: 2.2.8
4
4
  Summary: Data science friendly ORM combining Python
5
5
  Home-page: https://github.com/DovaX/dbhydra
6
6
  Author: DovaX
@@ -1,16 +1,16 @@
1
1
  dbhydra/__init__.py,sha256=DCocEeXf4QxdVlBRlNiFvuP5IZJ5aa77_DbUR-_4C14,65
2
- dbhydra/dbhydra_core.py,sha256=26xBOo3sl--xFa-IrnE3AmBjB3ut5CXUJ1add438ups,2470
2
+ dbhydra/dbhydra_core.py,sha256=gMroDA_kVph7JFimbsNpGZ33f-qiGhw-su9EUkNN0bA,2537
3
3
  dbhydra/test_migrator.py,sha256=e3Nnb2mCd3CfjhjSexNg1tXVJMjkl5cCoYcuhbfZ4pM,803
4
4
  dbhydra/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  dbhydra/src/abstract_db.py,sha256=lEP24vWz0HdGjQgSoHnawNK_NvRlSLuvzVSiiawssuw,5901
6
- dbhydra/src/abstract_table.py,sha256=82ciruUJBoGNqTcPjezTaYZJ03TpmuI_clkK95QGXy0,17420
6
+ dbhydra/src/abstract_table.py,sha256=4oZO5if4wMbyEWtr5JkR6LPxbxjUwMVf4xITbE-2RXE,17755
7
7
  dbhydra/src/bigquery_db.py,sha256=77XsgvYbANlvYaJnuVve-kz-PNBx_CHoYCL-eYnA8e4,1834
8
8
  dbhydra/src/migrator.py,sha256=QzaODEFfraD9_6HN_Osaidaj-nLYQryCYYWwJtUu3n8,18931
9
9
  dbhydra/src/mongo_db.py,sha256=mP48zRjI7mXKpm45R8prroZI-Eo7JKf0KJqGX-oTy3w,1922
10
- dbhydra/src/mysql_db.py,sha256=xFYy1Ty7iS3GXSncFoaKve4QN1SMJiuDjGyMbb-b1bw,3152
10
+ dbhydra/src/mysql_db.py,sha256=b0OV1nrYJBbzgTgBDKdLeENXQxKuYs_KhbvGvyymRf4,3180
11
11
  dbhydra/src/postgres_db.py,sha256=L7MaBq_6ArwDSP_5LaEqK58oLxZ1X7FgIokcDOSB7wk,1805
12
12
  dbhydra/src/sqlserver_db.py,sha256=9Xi3NAliqM79MTV8fpNQb0nWMH8Bqjl1leJSEqgyT94,3611
13
- dbhydra/src/tables.py,sha256=O66fps9U_gxwugOM38HoejuMRLgbTn6s2Omk0-Tgadw,46844
13
+ dbhydra/src/tables.py,sha256=F_WEookoyjv4r9HGfWdCquCc9MP5vH3vfonBPKNRQ3k,47184
14
14
  dbhydra/src/xlsx_db.py,sha256=z6d-IjMYMmXC591Mt5DcxIYWyluanjPRFd-sXtjjXww,3514
15
15
  dbhydra/src/errors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  dbhydra/src/errors/exceptions.py,sha256=LVpfbTd3NHfQIM-D5TFAU6hOZwGQ3b5DwFD4B6vtf2U,149
@@ -18,8 +18,8 @@ dbhydra/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  dbhydra/tests/test_cases.py,sha256=eAFGaHaIaab3md3HHm2_ryb_HHfObtcXDAEzLh4qWx8,508
19
19
  dbhydra/tests/test_mongo.py,sha256=M8TD72M0iQAk7ZcLTWwLmcmmF_zwALnYEGTWjhQlq0s,1979
20
20
  dbhydra/tests/test_sql.py,sha256=aPFXyA0jh8o9VG3B5f9fNz7qDbuVPZ9TcE2twn5dAeQ,3126
21
- dbhydra-2.2.5.dist-info/LICENSE,sha256=k49Yga8CP889JJaHlOpGFzr_be2nqMoep2chYeIDctk,1091
22
- dbhydra-2.2.5.dist-info/METADATA,sha256=vi9gDW4BS2V0rKyfFIF2yaf2osd9n75-E5LtxHd6A1E,2298
23
- dbhydra-2.2.5.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
24
- dbhydra-2.2.5.dist-info/top_level.txt,sha256=oO4Gf1T8_txIsIlp11GI0k7PtBIMb9GRwb5ObF4MLVg,8
25
- dbhydra-2.2.5.dist-info/RECORD,,
21
+ dbhydra-2.2.8.dist-info/LICENSE,sha256=k49Yga8CP889JJaHlOpGFzr_be2nqMoep2chYeIDctk,1091
22
+ dbhydra-2.2.8.dist-info/METADATA,sha256=oHsjGJM9YAxfzovKPp2Nlwy9jqomXk1FZzuGBEEgWlM,2298
23
+ dbhydra-2.2.8.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
24
+ dbhydra-2.2.8.dist-info/top_level.txt,sha256=oO4Gf1T8_txIsIlp11GI0k7PtBIMb9GRwb5ObF4MLVg,8
25
+ dbhydra-2.2.8.dist-info/RECORD,,