meerschaum 2.4.7__tar.gz → 2.4.8__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.
Files changed (275) hide show
  1. {meerschaum-2.4.7/meerschaum.egg-info → meerschaum-2.4.8}/PKG-INFO +7 -4
  2. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/sql.py +1 -1
  3. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_pipes.py +38 -38
  4. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_version.py +1 -1
  5. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_pipes.py +3 -3
  6. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_SQLConnector.py +1 -1
  7. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_instance.py +12 -12
  8. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_pipes.py +70 -49
  9. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_sql.py +3 -1
  10. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_sync.py +1 -1
  11. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/dataframe.py +32 -21
  12. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/dtypes/sql.py +32 -18
  13. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/packages/_packages.py +2 -1
  14. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/sql.py +11 -7
  15. {meerschaum-2.4.7 → meerschaum-2.4.8/meerschaum.egg-info}/PKG-INFO +7 -4
  16. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum.egg-info/requires.txt +6 -3
  17. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_pipes_dtypes.py +51 -0
  18. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_sync.py +61 -41
  19. {meerschaum-2.4.7 → meerschaum-2.4.8}/LICENSE +0 -0
  20. {meerschaum-2.4.7 → meerschaum-2.4.8}/NOTICE +0 -0
  21. {meerschaum-2.4.7 → meerschaum-2.4.8}/README.md +0 -0
  22. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/__init__.py +0 -0
  23. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/__main__.py +0 -0
  24. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/__init__.py +0 -0
  25. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/arguments/__init__.py +0 -0
  26. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
  27. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/arguments/_parser.py +0 -0
  28. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/docs/__init__.py +0 -0
  29. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/docs/index.py +0 -0
  30. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/entry.py +0 -0
  31. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/gui/__init__.py +0 -0
  32. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/gui/app/__init__.py +0 -0
  33. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/gui/app/_windows.py +0 -0
  34. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/gui/app/actions.py +0 -0
  35. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/gui/app/pipes.py +0 -0
  36. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/shell/Shell.py +0 -0
  37. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  38. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  39. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/shell/__init__.py +0 -0
  40. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  41. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/shell/updates.py +0 -0
  42. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  43. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/term/__init__.py +0 -0
  44. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/_internal/term/tools.py +0 -0
  45. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/__init__.py +0 -0
  46. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/api.py +0 -0
  47. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/attach.py +0 -0
  48. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/bootstrap.py +0 -0
  49. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/clear.py +0 -0
  50. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/copy.py +0 -0
  51. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/deduplicate.py +0 -0
  52. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/delete.py +0 -0
  53. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/drop.py +0 -0
  54. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/edit.py +0 -0
  55. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/install.py +0 -0
  56. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/login.py +0 -0
  57. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/os.py +0 -0
  58. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/pause.py +0 -0
  59. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/python.py +0 -0
  60. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/register.py +0 -0
  61. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/reload.py +0 -0
  62. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/restart.py +0 -0
  63. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/setup.py +0 -0
  64. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/sh.py +0 -0
  65. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/show.py +0 -0
  66. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/stack.py +0 -0
  67. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/start.py +0 -0
  68. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/stop.py +0 -0
  69. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/sync.py +0 -0
  70. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/tag.py +0 -0
  71. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/uninstall.py +0 -0
  72. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/upgrade.py +0 -0
  73. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/actions/verify.py +0 -0
  74. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/__init__.py +0 -0
  75. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/_chain.py +0 -0
  76. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/_events.py +0 -0
  77. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/_oauth2.py +0 -0
  78. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/_websockets.py +0 -0
  79. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/__init__.py +0 -0
  80. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/assets/__init__.py +0 -0
  81. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  82. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  83. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/assets/favicon.ico +0 -0
  84. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  85. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  86. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  87. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/custom.py +0 -0
  88. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
  89. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  90. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/login.py +0 -0
  91. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/pipes.py +0 -0
  92. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  93. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/register.py +0 -0
  94. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/components.py +0 -0
  95. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/connectors.py +0 -0
  96. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/graphs.py +0 -0
  97. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/jobs.py +0 -0
  98. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/keys.py +0 -0
  99. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/pages/__init__.py +0 -0
  100. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/pages/dashboard.py +0 -0
  101. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/pages/error.py +0 -0
  102. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/pages/login.py +0 -0
  103. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/pages/pipes.py +0 -0
  104. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/pages/plugins.py +0 -0
  105. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/pages/register.py +0 -0
  106. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/pipes.py +0 -0
  107. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/plugins.py +0 -0
  108. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/sessions.py +0 -0
  109. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/sync.py +0 -0
  110. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/users.py +0 -0
  111. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/websockets.py +0 -0
  112. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/dash/webterm.py +0 -0
  113. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/models/__init__.py +0 -0
  114. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/models/_interfaces.py +0 -0
  115. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/models/_locations.py +0 -0
  116. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/models/_metrics.py +0 -0
  117. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/models/_pipes.py +0 -0
  118. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/__init__.py +0 -0
  119. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/__init__.py +0 -0
  120. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/__init__.py +0 -0
  121. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  122. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/dash.css +0 -0
  123. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  124. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/styles.css +0 -0
  125. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/xterm.css +0 -0
  126. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  127. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  128. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/__init__.py +0 -0
  129. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/action_button.js +0 -0
  130. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/main.js +0 -0
  131. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/terminado.js +0 -0
  132. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/xterm.js +0 -0
  133. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/static/png/__init__.py +0 -0
  134. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/templates/__init__.py +0 -0
  135. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/templates/index.html +0 -0
  136. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/templates/old_index.html +0 -0
  137. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/templates/secret.html +0 -0
  138. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/resources/templates/termpage.html +0 -0
  139. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/__init__.py +0 -0
  140. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_actions.py +0 -0
  141. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_connectors.py +0 -0
  142. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_index.py +0 -0
  143. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_jobs.py +0 -0
  144. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_login.py +0 -0
  145. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_misc.py +0 -0
  146. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_plugins.py +0 -0
  147. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_users.py +0 -0
  148. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_version.py +0 -0
  149. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/routes/_webterm.py +0 -0
  150. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/api/tables/__init__.py +0 -0
  151. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/__init__.py +0 -0
  152. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_dash.py +0 -0
  153. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_default.py +0 -0
  154. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_edit.py +0 -0
  155. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_environment.py +0 -0
  156. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_formatting.py +0 -0
  157. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_jobs.py +0 -0
  158. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_patch.py +0 -0
  159. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_paths.py +0 -0
  160. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_preprocess.py +0 -0
  161. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_read_config.py +0 -0
  162. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_shell.py +0 -0
  163. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/_sync.py +0 -0
  164. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/paths.py +0 -0
  165. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/resources/__init__.py +0 -0
  166. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/stack/__init__.py +0 -0
  167. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/stack/grafana/__init__.py +0 -0
  168. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  169. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  170. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/stack/resources/__init__.py +0 -0
  171. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/config/static/__init__.py +0 -0
  172. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/_Connector.py +0 -0
  173. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/__init__.py +0 -0
  174. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_APIConnector.py +0 -0
  175. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/__init__.py +0 -0
  176. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_actions.py +0 -0
  177. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_fetch.py +0 -0
  178. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_jobs.py +0 -0
  179. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_login.py +0 -0
  180. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_misc.py +0 -0
  181. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_plugins.py +0 -0
  182. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_request.py +0 -0
  183. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_uri.py +0 -0
  184. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/api/_users.py +0 -0
  185. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/parse.py +0 -0
  186. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  187. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/plugin/__init__.py +0 -0
  188. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/poll.py +0 -0
  189. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/__init__.py +0 -0
  190. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_cli.py +0 -0
  191. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_create_engine.py +0 -0
  192. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_fetch.py +0 -0
  193. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_plugins.py +0 -0
  194. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_uri.py +0 -0
  195. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/_users.py +0 -0
  196. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  197. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/tables/types.py +0 -0
  198. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/sql/tools.py +0 -0
  199. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
  200. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/valkey/__init__.py +0 -0
  201. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_fetch.py +0 -0
  202. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_pipes.py +0 -0
  203. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_plugins.py +0 -0
  204. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_users.py +0 -0
  205. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/__init__.py +0 -0
  206. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_attributes.py +0 -0
  207. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  208. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_clear.py +0 -0
  209. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_copy.py +0 -0
  210. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_data.py +0 -0
  211. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  212. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_delete.py +0 -0
  213. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_drop.py +0 -0
  214. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_dtypes.py +0 -0
  215. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_edit.py +0 -0
  216. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_fetch.py +0 -0
  217. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_register.py +0 -0
  218. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_show.py +0 -0
  219. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Pipe/_verify.py +0 -0
  220. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/Plugin/__init__.py +0 -0
  221. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/User/_User.py +0 -0
  222. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/User/__init__.py +0 -0
  223. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/core/__init__.py +0 -0
  224. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/jobs/_Executor.py +0 -0
  225. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/jobs/_Job.py +0 -0
  226. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/jobs/__init__.py +0 -0
  227. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/jobs/systemd.py +0 -0
  228. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/plugins/_Plugin.py +0 -0
  229. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/plugins/__init__.py +0 -0
  230. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/plugins/bootstrap.py +0 -0
  231. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/__init__.py +0 -0
  232. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/_get_pipes.py +0 -0
  233. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/daemon/Daemon.py +0 -0
  234. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  235. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  236. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/daemon/StdinFile.py +0 -0
  237. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/daemon/__init__.py +0 -0
  238. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/daemon/_names.py +0 -0
  239. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/debug.py +0 -0
  240. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/dtypes/__init__.py +0 -0
  241. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/formatting/__init__.py +0 -0
  242. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/formatting/_jobs.py +0 -0
  243. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/formatting/_pipes.py +0 -0
  244. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/formatting/_pprint.py +0 -0
  245. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/formatting/_shell.py +0 -0
  246. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/interactive.py +0 -0
  247. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/misc.py +0 -0
  248. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/networking.py +0 -0
  249. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/packages/__init__.py +0 -0
  250. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/packages/lazy_loader.py +0 -0
  251. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/pool.py +0 -0
  252. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/process.py +0 -0
  253. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/prompt.py +0 -0
  254. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/schedule.py +0 -0
  255. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/threading.py +0 -0
  256. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/typing.py +0 -0
  257. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/venv/_Venv.py +0 -0
  258. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/venv/__init__.py +0 -0
  259. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/warnings.py +0 -0
  260. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum/utils/yaml.py +0 -0
  261. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum.egg-info/SOURCES.txt +0 -0
  262. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum.egg-info/dependency_links.txt +0 -0
  263. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum.egg-info/entry_points.txt +0 -0
  264. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum.egg-info/top_level.txt +0 -0
  265. {meerschaum-2.4.7 → meerschaum-2.4.8}/meerschaum.egg-info/zip-safe +0 -0
  266. {meerschaum-2.4.7 → meerschaum-2.4.8}/setup.cfg +0 -0
  267. {meerschaum-2.4.7 → meerschaum-2.4.8}/setup.py +0 -0
  268. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_actions.py +0 -0
  269. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_arguments.py +0 -0
  270. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_deduplicate.py +0 -0
  271. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_jobs.py +0 -0
  272. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_pipe_data.py +0 -0
  273. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_sql.py +0 -0
  274. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_users.py +0 -0
  275. {meerschaum-2.4.7 → meerschaum-2.4.8}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.4.7
3
+ Version: 2.4.8
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -127,7 +127,8 @@ Provides-Extra: sql
127
127
  Requires-Dist: numpy>=1.18.5; extra == "sql"
128
128
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "sql"
129
129
  Requires-Dist: pyarrow>=16.1.0; extra == "sql"
130
- Requires-Dist: dask[dataframe]>=2024.5.1; extra == "sql"
130
+ Requires-Dist: dask[complete]>=2024.5.1; extra == "sql"
131
+ Requires-Dist: partd>=1.4.2; extra == "sql"
131
132
  Requires-Dist: pytz; extra == "sql"
132
133
  Requires-Dist: joblib>=0.17.0; extra == "sql"
133
134
  Requires-Dist: SQLAlchemy>=2.0.5; extra == "sql"
@@ -186,7 +187,8 @@ Requires-Dist: valkey>=6.0.0; extra == "api"
186
187
  Requires-Dist: numpy>=1.18.5; extra == "api"
187
188
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "api"
188
189
  Requires-Dist: pyarrow>=16.1.0; extra == "api"
189
- Requires-Dist: dask[dataframe]>=2024.5.1; extra == "api"
190
+ Requires-Dist: dask[complete]>=2024.5.1; extra == "api"
191
+ Requires-Dist: partd>=1.4.2; extra == "api"
190
192
  Requires-Dist: pytz; extra == "api"
191
193
  Requires-Dist: joblib>=0.17.0; extra == "api"
192
194
  Requires-Dist: SQLAlchemy>=2.0.5; extra == "api"
@@ -292,7 +294,8 @@ Requires-Dist: pycparser>=2.21.0; extra == "full"
292
294
  Requires-Dist: numpy>=1.18.5; extra == "full"
293
295
  Requires-Dist: pandas[parquet]>=2.0.1; extra == "full"
294
296
  Requires-Dist: pyarrow>=16.1.0; extra == "full"
295
- Requires-Dist: dask[dataframe]>=2024.5.1; extra == "full"
297
+ Requires-Dist: dask[complete]>=2024.5.1; extra == "full"
298
+ Requires-Dist: partd>=1.4.2; extra == "full"
296
299
  Requires-Dist: pytz; extra == "full"
297
300
  Requires-Dist: joblib>=0.17.0; extra == "full"
298
301
  Requires-Dist: SQLAlchemy>=2.0.5; extra == "full"
@@ -59,7 +59,7 @@ def sql(
59
59
  - `sql local exec "INSERT INTO table (id) VALUES (1)"
60
60
  Execute the above query on `sql:local`.
61
61
  """
62
- from meerschaum.utils.dataframe impor to_json
62
+ from meerschaum.utils.dataframe import to_json
63
63
 
64
64
  if action is None:
65
65
  action = []
@@ -408,8 +408,8 @@ def get_pipe_data(
408
408
  _params = None
409
409
  if not isinstance(_params, dict):
410
410
  raise fastapi.HTTPException(
411
- status_code = 409,
412
- detail = "Params must be a valid JSON-encoded dictionary.",
411
+ status_code=409,
412
+ detail="Params must be a valid JSON-encoded dictionary.",
413
413
  )
414
414
 
415
415
  _select_columns = []
@@ -422,8 +422,8 @@ def get_pipe_data(
422
422
  _select_columns = None
423
423
  if not isinstance(_select_columns, list):
424
424
  raise fastapi.HTTPException(
425
- status_code = 409,
426
- detail = "Selected columns must be a JSON-encoded list."
425
+ status_code=409,
426
+ detail="Selected columns must be a JSON-encoded list."
427
427
  )
428
428
 
429
429
  _omit_columns = []
@@ -436,35 +436,35 @@ def get_pipe_data(
436
436
  _omit_columns = None
437
437
  if _omit_columns is None:
438
438
  raise fastapi.HTTPException(
439
- status_code = 409,
440
- detail = "Omitted columns must be a JSON-encoded list.",
439
+ status_code=409,
440
+ detail="Omitted columns must be a JSON-encoded list.",
441
441
  )
442
442
 
443
443
  pipe = get_pipe(connector_keys, metric_key, location_key)
444
444
  if not is_pipe_registered(pipe, pipes(refresh=True)):
445
445
  raise fastapi.HTTPException(
446
- status_code = 409,
447
- detail = "Pipe must be registered with the datetime column specified."
446
+ status_code=409,
447
+ detail="Pipe must be registered with the datetime column specified."
448
448
  )
449
449
 
450
450
  if pipe.target in ('users', 'plugins', 'pipes'):
451
451
  raise fastapi.HTTPException(
452
- status_code = 409,
453
- detail = f"Cannot retrieve data from protected table '{pipe.target}'.",
452
+ status_code=409,
453
+ detail=f"Cannot retrieve data from protected table '{pipe.target}'.",
454
454
  )
455
455
 
456
456
  df = pipe.get_data(
457
- select_columns = _select_columns,
458
- omit_columns = _omit_columns,
459
- begin = begin,
460
- end = end,
461
- params = _params,
462
- debug = debug,
457
+ select_columns=_select_columns,
458
+ omit_columns=_omit_columns,
459
+ begin=begin,
460
+ end=end,
461
+ params=_params,
462
+ debug=debug,
463
463
  )
464
464
  if df is None:
465
465
  raise fastapi.HTTPException(
466
- status_code = 400,
467
- detail = f"Could not fetch data with the given parameters.",
466
+ status_code=400,
467
+ detail="Could not fetch data with the given parameters.",
468
468
  )
469
469
 
470
470
  ### NaN cannot be JSON-serialized.
@@ -482,16 +482,16 @@ def get_pipe_data(
482
482
 
483
483
  @app.get(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/csv', tags=['Pipes'])
484
484
  def get_pipe_csv(
485
- connector_keys: str,
486
- metric_key: str,
487
- location_key: str,
488
- begin: Union[str, int, None] = None,
489
- end: Union[str, int, None] = None,
490
- params: Optional[str] = None,
491
- curr_user = (
492
- fastapi.Depends(manager) if not no_auth else None
493
- ),
494
- ) -> str:
485
+ connector_keys: str,
486
+ metric_key: str,
487
+ location_key: str,
488
+ begin: Union[str, int, None] = None,
489
+ end: Union[str, int, None] = None,
490
+ params: Optional[str] = None,
491
+ curr_user = (
492
+ fastapi.Depends(manager) if not no_auth else None
493
+ ),
494
+ ) -> str:
495
495
  """
496
496
  Get a Pipe's data as a CSV file. Optionally set query boundaries.
497
497
  """
@@ -518,8 +518,8 @@ def get_pipe_csv(
518
518
 
519
519
  if not isinstance(_params, dict):
520
520
  raise fastapi.HTTPException(
521
- status_code = 409,
522
- detail = "Params must be a valid JSON-encoded dictionary.",
521
+ status_code=409,
522
+ detail="Params must be a valid JSON-encoded dictionary.",
523
523
  )
524
524
 
525
525
  p = get_pipe(connector_keys, metric_key, location_key)
@@ -529,7 +529,7 @@ def get_pipe_csv(
529
529
  detail = "Pipe must be registered with the datetime column specified."
530
530
  )
531
531
 
532
- dt_col = pipe.columns.get('datetime', None)
532
+ dt_col = p.columns.get('datetime', None)
533
533
  if dt_col:
534
534
  if begin is None:
535
535
  begin = p.get_sync_time(round_down=False, newest=False)
@@ -552,13 +552,13 @@ def get_pipe_csv(
552
552
 
553
553
  @app.get(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/id', tags=['Pipes'])
554
554
  def get_pipe_id(
555
- connector_keys: str,
556
- metric_key: str,
557
- location_key: str,
558
- curr_user = (
559
- fastapi.Depends(manager) if not no_auth else None
560
- ),
561
- ) -> int:
555
+ connector_keys: str,
556
+ metric_key: str,
557
+ location_key: str,
558
+ curr_user = (
559
+ fastapi.Depends(manager) if not no_auth else None
560
+ ),
561
+ ) -> int:
562
562
  """
563
563
  Get a Pipe's ID.
564
564
  """
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.4.7"
5
+ __version__ = "2.4.8"
@@ -346,14 +346,14 @@ def get_pipe_data(
346
346
  try:
347
347
  response = self.get(
348
348
  r_url + "/data",
349
- params = {
349
+ params={
350
350
  'select_columns': json.dumps(select_columns),
351
351
  'omit_columns': json.dumps(omit_columns),
352
352
  'begin': begin,
353
353
  'end': end,
354
- 'params': json.dumps(params)
354
+ 'params': json.dumps(params, default=str)
355
355
  },
356
- debug = debug
356
+ debug=debug
357
357
  )
358
358
  if not response.ok:
359
359
  return None
@@ -272,7 +272,7 @@ class SQLConnector(Connector):
272
272
  """
273
273
  Return whether this connector may be multithreaded.
274
274
  """
275
- if self.flavor == 'duckdb':
275
+ if self.flavor in ('duckdb', 'oracle'):
276
276
  return False
277
277
  if self.flavor == 'sqlite':
278
278
  return ':memory:' not in self.URI
@@ -15,12 +15,12 @@ from meerschaum.utils.warnings import warn
15
15
 
16
16
  _in_memory_temp_tables: Dict[str, bool] = {}
17
17
  def _log_temporary_tables_creation(
18
- self,
19
- tables: Union[str, List[str]],
20
- ready_to_drop: bool = False,
21
- create: bool = True,
22
- debug: bool = False,
23
- ) -> SuccessTuple:
18
+ self,
19
+ tables: Union[str, List[str]],
20
+ ready_to_drop: bool = False,
21
+ create: bool = True,
22
+ debug: bool = False,
23
+ ) -> SuccessTuple:
24
24
  """
25
25
  Log a temporary table's creation for later deletion.
26
26
  """
@@ -58,15 +58,15 @@ def _log_temporary_tables_creation(
58
58
 
59
59
 
60
60
  def _drop_temporary_table(
61
- self,
62
- table: str,
63
- debug: bool = False,
64
- ) -> SuccessTuple:
61
+ self,
62
+ table: str,
63
+ debug: bool = False,
64
+ ) -> SuccessTuple:
65
65
  """
66
66
  Drop a temporary table and clear it from the internal table.
67
67
  """
68
- from meerschaum.utils.sql import sql_item_name, table_exists, SKIP_IF_EXISTS_FLAVORS
69
- if_exists = "IF EXISTS" if self.flavor not in SKIP_IF_EXISTS_FLAVORS else ""
68
+ from meerschaum.utils.sql import sql_item_name, table_exists, DROP_IF_EXISTS_FLAVORS
69
+ if_exists = "IF EXISTS" if self.flavor in DROP_IF_EXISTS_FLAVORS else ""
70
70
  if not if_exists:
71
71
  if not table_exists(table, self, self.internal_schema, debug=debug):
72
72
  return True, "Success"
@@ -459,6 +459,11 @@ def get_create_index_queries(
459
459
  + 'if_not_exists => true, '
460
460
  + "migrate_data => true);"
461
461
  )
462
+ elif self.flavor == 'mssql':
463
+ dt_query = (
464
+ f"CREATE CLUSTERED INDEX {_datetime_index_name} "
465
+ f"ON {_pipe_name} ({_datetime_name})"
466
+ )
462
467
  else: ### mssql, sqlite, etc.
463
468
  dt_query = (
464
469
  f"CREATE INDEX {_datetime_index_name} "
@@ -563,7 +568,12 @@ def get_drop_index_queries(
563
568
  return {}
564
569
  if not pipe.exists(debug=debug):
565
570
  return {}
566
- from meerschaum.utils.sql import sql_item_name, table_exists, hypertable_queries
571
+ from meerschaum.utils.sql import (
572
+ sql_item_name,
573
+ table_exists,
574
+ hypertable_queries,
575
+ DROP_IF_EXISTS_FLAVORS,
576
+ )
567
577
  drop_queries = {}
568
578
  schema = self.get_pipe_schema(pipe)
569
579
  schema_prefix = (schema + '_') if schema else ''
@@ -580,16 +590,17 @@ def get_drop_index_queries(
580
590
  is_hypertable_query = hypertable_queries[self.flavor].format(table_name=pipe_name)
581
591
  is_hypertable = self.value(is_hypertable_query, silent=True, debug=debug) is not None
582
592
 
593
+ if_exists_str = "IF EXISTS" if self.flavor in DROP_IF_EXISTS_FLAVORS else ""
583
594
  if is_hypertable:
584
595
  nuke_queries = []
585
596
  temp_table = '_' + pipe.target + '_temp_migration'
586
597
  temp_table_name = sql_item_name(temp_table, self.flavor, self.get_pipe_schema(pipe))
587
598
 
588
599
  if table_exists(temp_table, self, schema=self.get_pipe_schema(pipe), debug=debug):
589
- nuke_queries.append(f"DROP TABLE {temp_table_name}")
600
+ nuke_queries.append(f"DROP TABLE {if_exists_str} {temp_table_name}")
590
601
  nuke_queries += [
591
602
  f"SELECT * INTO {temp_table_name} FROM {pipe_name}",
592
- f"DROP TABLE {pipe_name}",
603
+ f"DROP TABLE {if_exists_str} {pipe_name}",
593
604
  f"ALTER TABLE {temp_table_name} RENAME TO {pipe_name_no_schema}",
594
605
  ]
595
606
  nuke_ix_keys = ('datetime', 'id')
@@ -811,7 +822,7 @@ def get_pipe_data(
811
822
  parse_df_datetimes(
812
823
  c,
813
824
  ignore_cols=ignore_dt_cols,
814
- chunksize = kw.get('chunksize', None),
825
+ chunksize=kw.get('chunksize', None),
815
826
  debug=debug,
816
827
  )
817
828
  for c in df
@@ -1017,7 +1028,7 @@ def get_pipe_data_query(
1017
1028
  if _dt and _dt in existing_cols:
1018
1029
  order_by += dt + ' ' + order + ','
1019
1030
  for key, quoted_col_name in quoted_indices.items():
1020
- if key == 'datetime':
1031
+ if dt == quoted_col_name:
1021
1032
  continue
1022
1033
  order_by += ' ' + quoted_col_name + ' ' + order + ','
1023
1034
  order_by = order_by[:-1]
@@ -1034,7 +1045,7 @@ def get_pipe_data_query(
1034
1045
  )
1035
1046
  else:
1036
1047
  query += f"\nLIMIT {limit}"
1037
-
1048
+
1038
1049
  if debug:
1039
1050
  to_print = (
1040
1051
  []
@@ -1315,7 +1326,7 @@ def sync_pipe(
1315
1326
  ) if dt_col else None
1316
1327
 
1317
1328
  transact_id = generate_password(3)
1318
- temp_target = '-' + transact_id + '_' + pipe.target
1329
+ temp_target = '##' + transact_id + '_' + pipe.target
1319
1330
  self._log_temporary_tables_creation(temp_target, create=(not pipe.temporary), debug=debug)
1320
1331
  temp_pipe = Pipe(
1321
1332
  pipe.connector_keys.replace(':', '_') + '_', pipe.metric_key, pipe.location_key,
@@ -1721,7 +1732,7 @@ def sync_pipe_inplace(
1721
1732
 
1722
1733
  delta_cols_types = get_table_cols_types(
1723
1734
  temp_tables['delta'],
1724
- connectable = connectable,
1735
+ connectable=connectable,
1725
1736
  flavor=self.flavor,
1726
1737
  schema=internal_schema,
1727
1738
  database=database,
@@ -1779,7 +1790,7 @@ def sync_pipe_inplace(
1779
1790
  create_joined_success, create_joined_msg = session_execute(
1780
1791
  session,
1781
1792
  create_joined_query,
1782
- debug = debug,
1793
+ debug=debug,
1783
1794
  ) if on_cols and not upsert else (True, "Success")
1784
1795
  if not create_joined_success:
1785
1796
  _ = clean_up_temp_tables()
@@ -1790,14 +1801,14 @@ def sync_pipe_inplace(
1790
1801
  + (', '.join([
1791
1802
  (
1792
1803
  "CASE\n WHEN " + sql_item_name(c + '_delta', self.flavor, None)
1793
- + " != " + get_null_replacement(typ, self.flavor)
1804
+ + " != " + get_null_replacement(typ, self.flavor)
1794
1805
  + " THEN " + sql_item_name(c + '_delta', self.flavor, None)
1795
1806
  + "\n ELSE NULL\nEND "
1796
1807
  + " AS " + sql_item_name(c, self.flavor, None)
1797
1808
  ) for c, typ in delta_cols.items()
1798
1809
  ]))
1799
1810
  + f"\nFROM {temp_table_names['joined']}\n"
1800
- + f"WHERE "
1811
+ + "WHERE "
1801
1812
  + '\nAND\n'.join([
1802
1813
  (
1803
1814
  sql_item_name(c + '_backtrack', self.flavor, None) + ' IS NULL'
@@ -1813,8 +1824,8 @@ def sync_pipe_inplace(
1813
1824
  (create_unseen_success, create_unseen_msg), create_unseen_results = session_execute(
1814
1825
  session,
1815
1826
  create_unseen_query,
1816
- with_results = True,
1817
- debug = debug
1827
+ with_results=True,
1828
+ debug=debug
1818
1829
  ) if not upsert else (True, "Success"), None
1819
1830
  if not create_unseen_success:
1820
1831
  _ = clean_up_temp_tables()
@@ -1832,7 +1843,7 @@ def sync_pipe_inplace(
1832
1843
  ) for c, typ in delta_cols.items()
1833
1844
  ]))
1834
1845
  + f"\nFROM {temp_table_names['joined']}\n"
1835
- + f"WHERE "
1846
+ + "WHERE "
1836
1847
  + '\nOR\n'.join([
1837
1848
  (
1838
1849
  sql_item_name(c + '_backtrack', self.flavor, None) + ' IS NOT NULL'
@@ -1849,8 +1860,8 @@ def sync_pipe_inplace(
1849
1860
  (create_update_success, create_update_msg), create_update_results = session_execute(
1850
1861
  session,
1851
1862
  create_update_query,
1852
- with_results = True,
1853
- debug = debug,
1863
+ with_results=True,
1864
+ debug=debug,
1854
1865
  ) if on_cols and not upsert else ((True, "Success"), [])
1855
1866
  apply_update_queries = (
1856
1867
  get_update_queries(
@@ -1858,12 +1869,12 @@ def sync_pipe_inplace(
1858
1869
  temp_tables['update'],
1859
1870
  session,
1860
1871
  on_cols,
1861
- upsert = upsert,
1862
- schema = self.get_pipe_schema(pipe),
1863
- patch_schema = internal_schema,
1864
- datetime_col = pipe.columns.get('datetime', None),
1865
- flavor = self.flavor,
1866
- debug = debug
1872
+ upsert=upsert,
1873
+ schema=self.get_pipe_schema(pipe),
1874
+ patch_schema=internal_schema,
1875
+ datetime_col=pipe.columns.get('datetime', None),
1876
+ flavor=self.flavor,
1877
+ debug=debug,
1867
1878
  )
1868
1879
  if on_cols else []
1869
1880
  )
@@ -1883,8 +1894,8 @@ def sync_pipe_inplace(
1883
1894
  (apply_unseen_success, apply_unseen_msg), apply_unseen_results = session_execute(
1884
1895
  session,
1885
1896
  apply_unseen_queries,
1886
- with_results = True,
1887
- debug = debug,
1897
+ with_results=True,
1898
+ debug=debug,
1888
1899
  ) if not upsert else (True, "Success"), None
1889
1900
  if not apply_unseen_success:
1890
1901
  _ = clean_up_temp_tables()
@@ -1894,8 +1905,8 @@ def sync_pipe_inplace(
1894
1905
  (apply_update_success, apply_update_msg), apply_update_results = session_execute(
1895
1906
  session,
1896
1907
  apply_update_queries,
1897
- with_results = True,
1898
- debug = debug,
1908
+ with_results=True,
1909
+ debug=debug,
1899
1910
  )
1900
1911
  if not apply_update_success:
1901
1912
  _ = clean_up_temp_tables()
@@ -2198,7 +2209,7 @@ def get_pipe_rowcount(
2198
2209
  else 'WHERE'
2199
2210
  )
2200
2211
  )
2201
-
2212
+
2202
2213
  result = self.value(query, debug=debug, silent=True)
2203
2214
  try:
2204
2215
  return int(result)
@@ -2207,11 +2218,11 @@ def get_pipe_rowcount(
2207
2218
 
2208
2219
 
2209
2220
  def drop_pipe(
2210
- self,
2211
- pipe: mrsm.Pipe,
2212
- debug: bool = False,
2213
- **kw
2214
- ) -> SuccessTuple:
2221
+ self,
2222
+ pipe: mrsm.Pipe,
2223
+ debug: bool = False,
2224
+ **kw
2225
+ ) -> SuccessTuple:
2215
2226
  """
2216
2227
  Drop a pipe's tables but maintain its registration.
2217
2228
 
@@ -2219,30 +2230,36 @@ def drop_pipe(
2219
2230
  ----------
2220
2231
  pipe: mrsm.Pipe
2221
2232
  The pipe to drop.
2222
-
2233
+
2234
+ Returns
2235
+ -------
2236
+ A `SuccessTuple` indicated success.
2223
2237
  """
2224
- from meerschaum.utils.sql import table_exists, sql_item_name
2238
+ from meerschaum.utils.sql import table_exists, sql_item_name, DROP_IF_EXISTS_FLAVORS
2225
2239
  success = True
2226
2240
  target = pipe.target
2227
2241
  target_name = (
2228
2242
  sql_item_name(target, self.flavor, self.get_pipe_schema(pipe))
2229
2243
  )
2230
2244
  if table_exists(target, self, debug=debug):
2231
- success = self.exec(f"DROP TABLE {target_name}", silent=True, debug=debug) is not None
2245
+ if_exists_str = "IF EXISTS" if self.flavor in DROP_IF_EXISTS_FLAVORS else ""
2246
+ success = self.exec(
2247
+ f"DROP TABLE {if_exists_str} {target_name}", silent=True, debug=debug
2248
+ ) is not None
2232
2249
 
2233
2250
  msg = "Success" if success else f"Failed to drop {pipe}."
2234
2251
  return success, msg
2235
2252
 
2236
2253
 
2237
2254
  def clear_pipe(
2238
- self,
2239
- pipe: mrsm.Pipe,
2240
- begin: Union[datetime, int, None] = None,
2241
- end: Union[datetime, int, None] = None,
2242
- params: Optional[Dict[str, Any]] = None,
2243
- debug: bool = False,
2244
- **kw
2245
- ) -> SuccessTuple:
2255
+ self,
2256
+ pipe: mrsm.Pipe,
2257
+ begin: Union[datetime, int, None] = None,
2258
+ end: Union[datetime, int, None] = None,
2259
+ params: Optional[Dict[str, Any]] = None,
2260
+ debug: bool = False,
2261
+ **kw
2262
+ ) -> SuccessTuple:
2246
2263
  """
2247
2264
  Delete a pipe's data within a bounded or unbounded interval without dropping the table.
2248
2265
 
@@ -2535,7 +2552,7 @@ def get_alter_columns_queries(
2535
2552
  """
2536
2553
  if not pipe.exists(debug=debug):
2537
2554
  return []
2538
- from meerschaum.utils.sql import sql_item_name
2555
+ from meerschaum.utils.sql import sql_item_name, DROP_IF_EXISTS_FLAVORS
2539
2556
  from meerschaum.utils.dataframe import get_numeric_cols
2540
2557
  from meerschaum.utils.dtypes import are_dtypes_equal
2541
2558
  from meerschaum.utils.dtypes.sql import (
@@ -2691,7 +2708,9 @@ def get_alter_columns_queries(
2691
2708
  f"\nFROM {sql_item_name(temp_table_name, self.flavor, self.get_pipe_schema(pipe))}"
2692
2709
  )
2693
2710
 
2694
- drop_query = "DROP TABLE " + sql_item_name(
2711
+ if_exists_str = "IF EXISTS" if self.flavor in DROP_IF_EXISTS_FLAVORS else ""
2712
+
2713
+ drop_query = f"DROP TABLE {if_exists_str}" + sql_item_name(
2695
2714
  temp_table_name, self.flavor, self.get_pipe_schema(pipe)
2696
2715
  )
2697
2716
  return [
@@ -2882,6 +2901,7 @@ def deduplicate_pipe(
2882
2901
  NO_CTE_FLAVORS,
2883
2902
  get_rename_table_queries,
2884
2903
  NO_SELECT_INTO_FLAVORS,
2904
+ DROP_IF_EXISTS_FLAVORS,
2885
2905
  get_create_table_query,
2886
2906
  format_cte_subquery,
2887
2907
  get_null_replacement,
@@ -3012,6 +3032,7 @@ def deduplicate_pipe(
3012
3032
  ) + f"""
3013
3033
  ORDER BY {index_list_str_ordered}
3014
3034
  """
3035
+ if_exists_str = "IF EXISTS" if self.flavor in DROP_IF_EXISTS_FLAVORS else ""
3015
3036
  alter_queries = flatten_list([
3016
3037
  get_rename_table_queries(
3017
3038
  pipe.target, temp_old_table, self.flavor, schema=self.get_pipe_schema(pipe)
@@ -3020,7 +3041,7 @@ def deduplicate_pipe(
3020
3041
  dedup_table, pipe.target, self.flavor, schema=self.get_pipe_schema(pipe)
3021
3042
  ),
3022
3043
  f"""
3023
- DROP TABLE {temp_old_table_name}
3044
+ DROP TABLE {if_exists_str} {temp_old_table_name}
3024
3045
  """,
3025
3046
  ])
3026
3047
 
@@ -3030,9 +3051,9 @@ def deduplicate_pipe(
3030
3051
 
3031
3052
  results = self.exec_queries(
3032
3053
  alter_queries,
3033
- break_on_error = True,
3034
- rollback = True,
3035
- debug = debug,
3054
+ break_on_error=True,
3055
+ rollback=True,
3056
+ debug=debug,
3036
3057
  )
3037
3058
 
3038
3059
  fail_query = None
@@ -753,6 +753,7 @@ def to_sql(
753
753
  table_exists,
754
754
  json_flavors,
755
755
  truncate_item_name,
756
+ DROP_IF_EXISTS_FLAVORS,
756
757
  )
757
758
  from meerschaum.utils.dataframe import get_json_cols, get_numeric_cols, get_uuid_cols
758
759
  from meerschaum.utils.dtypes import are_dtypes_equal, quantize_decimal
@@ -827,12 +828,13 @@ def to_sql(
827
828
  'parallel': True,
828
829
  })
829
830
 
831
+ if_exists_str = "IF EXISTS" if self.flavor in DROP_IF_EXISTS_FLAVORS else ""
830
832
  if self.flavor == 'oracle':
831
833
  ### For some reason 'replace' doesn't work properly in pandas,
832
834
  ### so try dropping first.
833
835
  if if_exists == 'replace' and table_exists(name, self, schema=schema, debug=debug):
834
836
  success = self.exec(
835
- "DROP TABLE " + sql_item_name(name, 'oracle', schema)
837
+ f"DROP TABLE {if_exists_str}" + sql_item_name(name, 'oracle', schema)
836
838
  ) is not None
837
839
  if not success:
838
840
  warn(f"Unable to drop {name}")
@@ -295,7 +295,7 @@ def sync(
295
295
 
296
296
  ### CHECKPOINT: Retrieved the DataFrame.
297
297
  _checkpoint(**kw)
298
-
298
+
299
299
  ### Allow for dataframe generators or iterables.
300
300
  if df_is_chunk_generator(df):
301
301
  kw['workers'] = p.get_num_workers(kw.get('workers', None))