meerschaum 2.4.6__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.
- {meerschaum-2.4.6/meerschaum.egg-info → meerschaum-2.4.8}/PKG-INFO +7 -4
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/sql.py +1 -1
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_pipes.py +38 -38
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_version.py +1 -1
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_pipes.py +3 -3
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_SQLConnector.py +1 -1
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_instance.py +12 -12
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_pipes.py +70 -51
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_sql.py +3 -1
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_sync.py +1 -1
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/dataframe.py +32 -21
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/dtypes/sql.py +32 -18
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/packages/_packages.py +2 -1
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/sql.py +11 -7
- {meerschaum-2.4.6 → meerschaum-2.4.8/meerschaum.egg-info}/PKG-INFO +7 -4
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum.egg-info/requires.txt +6 -3
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_pipes_dtypes.py +51 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_sync.py +61 -41
- {meerschaum-2.4.6 → meerschaum-2.4.8}/LICENSE +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/NOTICE +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/README.md +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/__main__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/arguments/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/arguments/_parser.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/docs/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/docs/index.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/entry.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/gui/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/gui/app/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/gui/app/_windows.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/gui/app/actions.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/gui/app/pipes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/shell/Shell.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/shell/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/shell/resources/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/shell/updates.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/term/TermPageHandler.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/term/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/_internal/term/tools.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/api.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/attach.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/bootstrap.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/clear.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/copy.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/deduplicate.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/delete.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/drop.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/edit.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/install.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/login.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/os.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/pause.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/python.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/register.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/reload.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/restart.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/setup.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/sh.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/show.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/stack.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/start.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/stop.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/sync.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/tag.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/uninstall.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/upgrade.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/actions/verify.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/_chain.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/_events.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/_oauth2.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/_websockets.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/assets/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/assets/ansi_up.js +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/assets/favicon.ico +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/custom.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/jobs.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/login.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/pipes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/plugins.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/callbacks/register.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/components.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/connectors.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/graphs.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/jobs.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/keys.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/pages/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/pages/dashboard.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/pages/error.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/pages/login.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/pages/pipes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/pages/plugins.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/pages/register.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/pipes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/plugins.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/sessions.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/sync.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/users.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/websockets.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/dash/webterm.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/models/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/models/_interfaces.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/models/_locations.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/models/_metrics.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/models/_pipes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/dash.css +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/styles.css +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/css/xterm.css +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/ico/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/ico/logo.ico +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/action_button.js +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/main.js +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/terminado.js +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/js/xterm.js +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/static/png/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/templates/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/templates/index.html +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/templates/old_index.html +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/templates/secret.html +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/resources/templates/termpage.html +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_actions.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_connectors.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_index.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_jobs.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_login.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_misc.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_plugins.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_users.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_version.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/routes/_webterm.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/api/tables/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_dash.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_default.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_edit.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_environment.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_formatting.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_jobs.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_patch.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_paths.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_preprocess.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_read_config.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_shell.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/_sync.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/paths.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/resources/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/stack/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/stack/grafana/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/stack/resources/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/config/static/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/_Connector.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_APIConnector.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_actions.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_fetch.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_jobs.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_login.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_misc.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_plugins.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_request.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_uri.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/api/_users.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/parse.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/plugin/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/poll.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_cli.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_create_engine.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_fetch.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_plugins.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_uri.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/_users.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/tables/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/tables/types.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/sql/tools.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/valkey/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_fetch.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_pipes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_plugins.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/connectors/valkey/_users.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_attributes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_bootstrap.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_clear.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_copy.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_data.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_deduplicate.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_delete.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_drop.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_dtypes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_edit.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_fetch.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_register.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_show.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Pipe/_verify.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/Plugin/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/User/_User.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/User/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/core/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/jobs/_Executor.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/jobs/_Job.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/jobs/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/jobs/systemd.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/plugins/_Plugin.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/plugins/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/plugins/bootstrap.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/_get_pipes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/daemon/Daemon.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/daemon/RotatingFile.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/daemon/StdinFile.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/daemon/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/daemon/_names.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/debug.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/dtypes/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/formatting/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/formatting/_jobs.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/formatting/_pipes.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/formatting/_pprint.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/formatting/_shell.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/interactive.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/misc.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/networking.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/packages/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/packages/lazy_loader.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/pool.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/process.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/prompt.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/schedule.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/threading.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/typing.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/venv/_Venv.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/venv/__init__.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/warnings.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum/utils/yaml.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum.egg-info/SOURCES.txt +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum.egg-info/dependency_links.txt +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum.egg-info/entry_points.txt +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum.egg-info/top_level.txt +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/meerschaum.egg-info/zip-safe +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/setup.cfg +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/setup.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_actions.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_arguments.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_deduplicate.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_jobs.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_pipe_data.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_sql.py +0 -0
- {meerschaum-2.4.6 → meerschaum-2.4.8}/tests/test_users.py +0 -0
- {meerschaum-2.4.6 → 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.
|
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[
|
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[
|
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[
|
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"
|
@@ -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
|
412
|
-
detail
|
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
|
426
|
-
detail
|
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
|
440
|
-
detail
|
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
|
447
|
-
detail
|
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
|
453
|
-
detail
|
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
|
458
|
-
omit_columns
|
459
|
-
begin
|
460
|
-
end
|
461
|
-
params
|
462
|
-
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
|
467
|
-
detail
|
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
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
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
|
522
|
-
detail
|
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 =
|
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
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
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
|
"""
|
@@ -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
|
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
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
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,
|
69
|
-
if_exists = "IF EXISTS" if self.flavor
|
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
|
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
|
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
|
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 = '
|
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,
|
@@ -1579,8 +1590,6 @@ def sync_pipe_inplace(
|
|
1579
1590
|
if not new_cols_types:
|
1580
1591
|
return False, f"Failed to get new columns for {pipe}."
|
1581
1592
|
|
1582
|
-
mrsm.pprint(new_cols_types)
|
1583
|
-
|
1584
1593
|
new_cols = {
|
1585
1594
|
str(col_name): get_pd_type_from_db_type(str(col_type))
|
1586
1595
|
for col_name, col_type in new_cols_types.items()
|
@@ -1723,7 +1732,7 @@ def sync_pipe_inplace(
|
|
1723
1732
|
|
1724
1733
|
delta_cols_types = get_table_cols_types(
|
1725
1734
|
temp_tables['delta'],
|
1726
|
-
connectable
|
1735
|
+
connectable=connectable,
|
1727
1736
|
flavor=self.flavor,
|
1728
1737
|
schema=internal_schema,
|
1729
1738
|
database=database,
|
@@ -1781,7 +1790,7 @@ def sync_pipe_inplace(
|
|
1781
1790
|
create_joined_success, create_joined_msg = session_execute(
|
1782
1791
|
session,
|
1783
1792
|
create_joined_query,
|
1784
|
-
debug
|
1793
|
+
debug=debug,
|
1785
1794
|
) if on_cols and not upsert else (True, "Success")
|
1786
1795
|
if not create_joined_success:
|
1787
1796
|
_ = clean_up_temp_tables()
|
@@ -1792,14 +1801,14 @@ def sync_pipe_inplace(
|
|
1792
1801
|
+ (', '.join([
|
1793
1802
|
(
|
1794
1803
|
"CASE\n WHEN " + sql_item_name(c + '_delta', self.flavor, None)
|
1795
|
-
+ " != " + get_null_replacement(typ, self.flavor)
|
1804
|
+
+ " != " + get_null_replacement(typ, self.flavor)
|
1796
1805
|
+ " THEN " + sql_item_name(c + '_delta', self.flavor, None)
|
1797
1806
|
+ "\n ELSE NULL\nEND "
|
1798
1807
|
+ " AS " + sql_item_name(c, self.flavor, None)
|
1799
1808
|
) for c, typ in delta_cols.items()
|
1800
1809
|
]))
|
1801
1810
|
+ f"\nFROM {temp_table_names['joined']}\n"
|
1802
|
-
+
|
1811
|
+
+ "WHERE "
|
1803
1812
|
+ '\nAND\n'.join([
|
1804
1813
|
(
|
1805
1814
|
sql_item_name(c + '_backtrack', self.flavor, None) + ' IS NULL'
|
@@ -1815,8 +1824,8 @@ def sync_pipe_inplace(
|
|
1815
1824
|
(create_unseen_success, create_unseen_msg), create_unseen_results = session_execute(
|
1816
1825
|
session,
|
1817
1826
|
create_unseen_query,
|
1818
|
-
with_results
|
1819
|
-
debug
|
1827
|
+
with_results=True,
|
1828
|
+
debug=debug
|
1820
1829
|
) if not upsert else (True, "Success"), None
|
1821
1830
|
if not create_unseen_success:
|
1822
1831
|
_ = clean_up_temp_tables()
|
@@ -1834,7 +1843,7 @@ def sync_pipe_inplace(
|
|
1834
1843
|
) for c, typ in delta_cols.items()
|
1835
1844
|
]))
|
1836
1845
|
+ f"\nFROM {temp_table_names['joined']}\n"
|
1837
|
-
+
|
1846
|
+
+ "WHERE "
|
1838
1847
|
+ '\nOR\n'.join([
|
1839
1848
|
(
|
1840
1849
|
sql_item_name(c + '_backtrack', self.flavor, None) + ' IS NOT NULL'
|
@@ -1851,8 +1860,8 @@ def sync_pipe_inplace(
|
|
1851
1860
|
(create_update_success, create_update_msg), create_update_results = session_execute(
|
1852
1861
|
session,
|
1853
1862
|
create_update_query,
|
1854
|
-
with_results
|
1855
|
-
debug
|
1863
|
+
with_results=True,
|
1864
|
+
debug=debug,
|
1856
1865
|
) if on_cols and not upsert else ((True, "Success"), [])
|
1857
1866
|
apply_update_queries = (
|
1858
1867
|
get_update_queries(
|
@@ -1860,12 +1869,12 @@ def sync_pipe_inplace(
|
|
1860
1869
|
temp_tables['update'],
|
1861
1870
|
session,
|
1862
1871
|
on_cols,
|
1863
|
-
upsert
|
1864
|
-
schema
|
1865
|
-
patch_schema
|
1866
|
-
datetime_col
|
1867
|
-
flavor
|
1868
|
-
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,
|
1869
1878
|
)
|
1870
1879
|
if on_cols else []
|
1871
1880
|
)
|
@@ -1885,8 +1894,8 @@ def sync_pipe_inplace(
|
|
1885
1894
|
(apply_unseen_success, apply_unseen_msg), apply_unseen_results = session_execute(
|
1886
1895
|
session,
|
1887
1896
|
apply_unseen_queries,
|
1888
|
-
with_results
|
1889
|
-
debug
|
1897
|
+
with_results=True,
|
1898
|
+
debug=debug,
|
1890
1899
|
) if not upsert else (True, "Success"), None
|
1891
1900
|
if not apply_unseen_success:
|
1892
1901
|
_ = clean_up_temp_tables()
|
@@ -1896,8 +1905,8 @@ def sync_pipe_inplace(
|
|
1896
1905
|
(apply_update_success, apply_update_msg), apply_update_results = session_execute(
|
1897
1906
|
session,
|
1898
1907
|
apply_update_queries,
|
1899
|
-
with_results
|
1900
|
-
debug
|
1908
|
+
with_results=True,
|
1909
|
+
debug=debug,
|
1901
1910
|
)
|
1902
1911
|
if not apply_update_success:
|
1903
1912
|
_ = clean_up_temp_tables()
|
@@ -2200,7 +2209,7 @@ def get_pipe_rowcount(
|
|
2200
2209
|
else 'WHERE'
|
2201
2210
|
)
|
2202
2211
|
)
|
2203
|
-
|
2212
|
+
|
2204
2213
|
result = self.value(query, debug=debug, silent=True)
|
2205
2214
|
try:
|
2206
2215
|
return int(result)
|
@@ -2209,11 +2218,11 @@ def get_pipe_rowcount(
|
|
2209
2218
|
|
2210
2219
|
|
2211
2220
|
def drop_pipe(
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
2221
|
+
self,
|
2222
|
+
pipe: mrsm.Pipe,
|
2223
|
+
debug: bool = False,
|
2224
|
+
**kw
|
2225
|
+
) -> SuccessTuple:
|
2217
2226
|
"""
|
2218
2227
|
Drop a pipe's tables but maintain its registration.
|
2219
2228
|
|
@@ -2221,30 +2230,36 @@ def drop_pipe(
|
|
2221
2230
|
----------
|
2222
2231
|
pipe: mrsm.Pipe
|
2223
2232
|
The pipe to drop.
|
2224
|
-
|
2233
|
+
|
2234
|
+
Returns
|
2235
|
+
-------
|
2236
|
+
A `SuccessTuple` indicated success.
|
2225
2237
|
"""
|
2226
|
-
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
|
2227
2239
|
success = True
|
2228
2240
|
target = pipe.target
|
2229
2241
|
target_name = (
|
2230
2242
|
sql_item_name(target, self.flavor, self.get_pipe_schema(pipe))
|
2231
2243
|
)
|
2232
2244
|
if table_exists(target, self, debug=debug):
|
2233
|
-
|
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
|
2234
2249
|
|
2235
2250
|
msg = "Success" if success else f"Failed to drop {pipe}."
|
2236
2251
|
return success, msg
|
2237
2252
|
|
2238
2253
|
|
2239
2254
|
def clear_pipe(
|
2240
|
-
|
2241
|
-
|
2242
|
-
|
2243
|
-
|
2244
|
-
|
2245
|
-
|
2246
|
-
|
2247
|
-
|
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:
|
2248
2263
|
"""
|
2249
2264
|
Delete a pipe's data within a bounded or unbounded interval without dropping the table.
|
2250
2265
|
|
@@ -2537,7 +2552,7 @@ def get_alter_columns_queries(
|
|
2537
2552
|
"""
|
2538
2553
|
if not pipe.exists(debug=debug):
|
2539
2554
|
return []
|
2540
|
-
from meerschaum.utils.sql import sql_item_name
|
2555
|
+
from meerschaum.utils.sql import sql_item_name, DROP_IF_EXISTS_FLAVORS
|
2541
2556
|
from meerschaum.utils.dataframe import get_numeric_cols
|
2542
2557
|
from meerschaum.utils.dtypes import are_dtypes_equal
|
2543
2558
|
from meerschaum.utils.dtypes.sql import (
|
@@ -2693,7 +2708,9 @@ def get_alter_columns_queries(
|
|
2693
2708
|
f"\nFROM {sql_item_name(temp_table_name, self.flavor, self.get_pipe_schema(pipe))}"
|
2694
2709
|
)
|
2695
2710
|
|
2696
|
-
|
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(
|
2697
2714
|
temp_table_name, self.flavor, self.get_pipe_schema(pipe)
|
2698
2715
|
)
|
2699
2716
|
return [
|
@@ -2884,6 +2901,7 @@ def deduplicate_pipe(
|
|
2884
2901
|
NO_CTE_FLAVORS,
|
2885
2902
|
get_rename_table_queries,
|
2886
2903
|
NO_SELECT_INTO_FLAVORS,
|
2904
|
+
DROP_IF_EXISTS_FLAVORS,
|
2887
2905
|
get_create_table_query,
|
2888
2906
|
format_cte_subquery,
|
2889
2907
|
get_null_replacement,
|
@@ -3014,6 +3032,7 @@ def deduplicate_pipe(
|
|
3014
3032
|
) + f"""
|
3015
3033
|
ORDER BY {index_list_str_ordered}
|
3016
3034
|
"""
|
3035
|
+
if_exists_str = "IF EXISTS" if self.flavor in DROP_IF_EXISTS_FLAVORS else ""
|
3017
3036
|
alter_queries = flatten_list([
|
3018
3037
|
get_rename_table_queries(
|
3019
3038
|
pipe.target, temp_old_table, self.flavor, schema=self.get_pipe_schema(pipe)
|
@@ -3022,7 +3041,7 @@ def deduplicate_pipe(
|
|
3022
3041
|
dedup_table, pipe.target, self.flavor, schema=self.get_pipe_schema(pipe)
|
3023
3042
|
),
|
3024
3043
|
f"""
|
3025
|
-
DROP TABLE {temp_old_table_name}
|
3044
|
+
DROP TABLE {if_exists_str} {temp_old_table_name}
|
3026
3045
|
""",
|
3027
3046
|
])
|
3028
3047
|
|
@@ -3032,9 +3051,9 @@ def deduplicate_pipe(
|
|
3032
3051
|
|
3033
3052
|
results = self.exec_queries(
|
3034
3053
|
alter_queries,
|
3035
|
-
break_on_error
|
3036
|
-
rollback
|
3037
|
-
debug
|
3054
|
+
break_on_error=True,
|
3055
|
+
rollback=True,
|
3056
|
+
debug=debug,
|
3038
3057
|
)
|
3039
3058
|
|
3040
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}")
|