hare-orm 0.9.0__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.
- hare/__init__.py +47 -0
- hare/__main__.py +8 -0
- hare/classes/__init__.py +1 -0
- hare/classes/class_path.py +50 -0
- hare/classes/class_property.py +18 -0
- hare/classes/comparable_values.py +113 -0
- hare/classes/constants.py +11 -0
- hare/classes/declared_subclass.py +26 -0
- hare/classes/lazy_exports.py +56 -0
- hare/classes/shown_value_repr.py +21 -0
- hare/classes/value_descriptions.py +81 -0
- hare/cli/__init__.py +3 -0
- hare/cli/__main__.py +7 -0
- hare/cli/arg_parser_builder.py +344 -0
- hare/cli/commands/__init__.py +0 -0
- hare/cli/commands/database_shell_commands.py +56 -0
- hare/cli/commands/distributed_recovery_commands.py +86 -0
- hare/cli/commands/interactive_rename_questions.py +30 -0
- hare/cli/commands/migration_commands.py +579 -0
- hare/cli/commands/schema_commands.py +123 -0
- hare/cli/commands/stub_commands.py +52 -0
- hare/cli/config_locator.py +37 -0
- hare/cli/constants.py +24 -0
- hare/cli/context/__init__.py +9 -0
- hare/cli/context/cli_context.py +17 -0
- hare/cli/context/command_context.py +108 -0
- hare/cli/exceptions.py +9 -0
- hare/cli/hare_cli.py +111 -0
- hare/cli/output/__init__.py +1 -0
- hare/cli/output/output_formatter.py +145 -0
- hare/cli/output/terminal_colors.py +89 -0
- hare/cli/plugins/__init__.py +16 -0
- hare/cli/plugins/cli_command.py +43 -0
- hare/cli/plugins/cli_command_registry.py +144 -0
- hare/cli/plugins/loaded_cli_command.py +13 -0
- hare/cli/shell_launcher.py +95 -0
- hare/contrib/__init__.py +0 -0
- hare/contrib/application_lifecycle.py +157 -0
- hare/contrib/factories/__init__.py +39 -0
- hare/contrib/factories/constants.py +21 -0
- hare/contrib/factories/factory_reference.py +27 -0
- hare/contrib/factories/field_declarations/__init__.py +1 -0
- hare/contrib/factories/field_declarations/declaration.py +19 -0
- hare/contrib/factories/field_declarations/faker.py +49 -0
- hare/contrib/factories/field_declarations/iterator.py +36 -0
- hare/contrib/factories/field_declarations/lazy_attribute.py +35 -0
- hare/contrib/factories/field_declarations/lazy_function.py +22 -0
- hare/contrib/factories/field_declarations/many_to_many.py +40 -0
- hare/contrib/factories/field_declarations/post_declaration.py +22 -0
- hare/contrib/factories/field_declarations/related_factory.py +37 -0
- hare/contrib/factories/field_declarations/sequence.py +22 -0
- hare/contrib/factories/field_declarations/sub_factory.py +30 -0
- hare/contrib/factories/model_factory.py +284 -0
- hare/contrib/factories/trait.py +23 -0
- hare/contrib/frameworks/__init__.py +14 -0
- hare/contrib/frameworks/constants.py +45 -0
- hare/contrib/frameworks/error_answers.py +93 -0
- hare/contrib/frameworks/exceptions.py +19 -0
- hare/contrib/frameworks/fastapi/__init__.py +12 -0
- hare/contrib/frameworks/fastapi/constants.py +4 -0
- hare/contrib/frameworks/fastapi/hare_exception_handlers.py +103 -0
- hare/contrib/frameworks/fastapi/hare_fast_api.py +139 -0
- hare/contrib/frameworks/fastapi/middleware/__init__.py +7 -0
- hare/contrib/frameworks/fastapi/middleware/request_state_reset_middleware.py +27 -0
- hare/contrib/frameworks/fastapi/middleware/transaction_failing_handler.py +31 -0
- hare/contrib/frameworks/fastapi/middleware/transaction_middleware.py +72 -0
- hare/contrib/frameworks/fastapi/request_query_dependency.py +88 -0
- hare/contrib/frameworks/hare_lifecycle.py +50 -0
- hare/contrib/frameworks/health_routes.py +101 -0
- hare/contrib/frameworks/litestar/__init__.py +14 -0
- hare/contrib/frameworks/litestar/constants.py +18 -0
- hare/contrib/frameworks/litestar/hare_dto.py +194 -0
- hare/contrib/frameworks/litestar/hare_exception_handlers.py +77 -0
- hare/contrib/frameworks/litestar/hare_plugin.py +181 -0
- hare/contrib/frameworks/litestar/hare_transfer_function_factory.py +38 -0
- hare/contrib/frameworks/litestar/middleware/__init__.py +7 -0
- hare/contrib/frameworks/litestar/middleware/request_state_reset_middleware.py +23 -0
- hare/contrib/frameworks/litestar/middleware/transaction_middleware.py +35 -0
- hare/contrib/frameworks/litestar/request_query_di_plugin.py +96 -0
- hare/contrib/frameworks/pages/__init__.py +22 -0
- hare/contrib/frameworks/pages/cursor_page_schema.py +25 -0
- hare/contrib/frameworks/pages/page_schema.py +25 -0
- hare/contrib/frameworks/pages/scroll_page_schema.py +23 -0
- hare/contrib/frameworks/parameter_annotation.py +110 -0
- hare/contrib/frameworks/request_state.py +16 -0
- hare/contrib/frameworks/request_transaction.py +186 -0
- hare/contrib/frameworks/robyn/__init__.py +13 -0
- hare/contrib/frameworks/robyn/application/__init__.py +11 -0
- hare/contrib/frameworks/robyn/application/hare_robyn.py +199 -0
- hare/contrib/frameworks/robyn/application/hare_sub_router.py +50 -0
- hare/contrib/frameworks/robyn/constants.py +32 -0
- hare/contrib/frameworks/robyn/hare_exception_handlers.py +128 -0
- hare/contrib/frameworks/robyn/hare_open_api.py +91 -0
- hare/contrib/frameworks/robyn/route_handler.py +198 -0
- hare/contrib/mypy/__init__.py +11 -0
- hare/contrib/mypy/annotation_types.py +170 -0
- hare/contrib/mypy/constants.py +83 -0
- hare/contrib/mypy/enums.py +18 -0
- hare/contrib/mypy/field_names_check.py +222 -0
- hare/contrib/mypy/filter_arguments_check.py +129 -0
- hare/contrib/mypy/hare_mypy_plugin.py +166 -0
- hare/contrib/mypy/instance_attribute_types.py +137 -0
- hare/contrib/mypy/model_registry.py +127 -0
- hare/contrib/mypy/mypy_types.py +383 -0
- hare/contrib/mypy/queryset_extension_methods.py +109 -0
- hare/contrib/mypy/values_row_types.py +146 -0
- hare/contrib/mypy/write_arguments_check.py +159 -0
- hare/contrib/notify/__init__.py +5 -0
- hare/contrib/notify/constants.py +14 -0
- hare/contrib/notify/notification_listener.py +317 -0
- hare/contrib/opentelemetry/__init__.py +16 -0
- hare/contrib/opentelemetry/constants.py +31 -0
- hare/contrib/opentelemetry/open_telemetry_instrumentor.py +60 -0
- hare/contrib/opentelemetry/pool_metric_instruments.py +210 -0
- hare/contrib/opentelemetry/query_spans.py +69 -0
- hare/contrib/outbox/__init__.py +65 -0
- hare/contrib/outbox/broker_arguments.py +40 -0
- hare/contrib/outbox/brokers/__init__.py +1 -0
- hare/contrib/outbox/brokers/rabbitmq_connection.py +55 -0
- hare/contrib/outbox/brokers/redis_connection.py +42 -0
- hare/contrib/outbox/capture/__init__.py +6 -0
- hare/contrib/outbox/capture/change_capture.py +366 -0
- hare/contrib/outbox/capture/change_extension.py +22 -0
- hare/contrib/outbox/capture/constants.py +19 -0
- hare/contrib/outbox/constants.py +31 -0
- hare/contrib/outbox/deliveries/__init__.py +22 -0
- hare/contrib/outbox/deliveries/callable_delivery.py +44 -0
- hare/contrib/outbox/deliveries/constants.py +19 -0
- hare/contrib/outbox/deliveries/kafka_delivery.py +124 -0
- hare/contrib/outbox/deliveries/outbox_delivery.py +106 -0
- hare/contrib/outbox/deliveries/rabbitmq_delivery.py +63 -0
- hare/contrib/outbox/deliveries/redis_streams_delivery.py +110 -0
- hare/contrib/outbox/deliveries/topic_router.py +103 -0
- hare/contrib/outbox/deliveries/webhook_delivery.py +106 -0
- hare/contrib/outbox/exceptions.py +7 -0
- hare/contrib/outbox/outbox_event.py +362 -0
- hare/contrib/outbox/outbox_json_encoding.py +87 -0
- hare/contrib/outbox/relay/__init__.py +7 -0
- hare/contrib/outbox/relay/constants.py +41 -0
- hare/contrib/outbox/relay/declarations.py +76 -0
- hare/contrib/outbox/relay/outbox_backlog.py +18 -0
- hare/contrib/outbox/relay/outbox_relay.py +646 -0
- hare/contrib/outbox/wakeups/__init__.py +20 -0
- hare/contrib/outbox/wakeups/constants.py +20 -0
- hare/contrib/outbox/wakeups/in_process_wakeup.py +17 -0
- hare/contrib/outbox/wakeups/kafka_wakeup.py +123 -0
- hare/contrib/outbox/wakeups/listen_notify_wakeup.py +75 -0
- hare/contrib/outbox/wakeups/outbox_wakeup.py +202 -0
- hare/contrib/outbox/wakeups/rabbitmq_wakeup.py +64 -0
- hare/contrib/outbox/wakeups/redis_wakeup.py +53 -0
- hare/contrib/pydantic/__init__.py +12 -0
- hare/contrib/pydantic/constants.py +41 -0
- hare/contrib/pydantic/creation/__init__.py +1 -0
- hare/contrib/pydantic/creation/computed_field_schemas.py +77 -0
- hare/contrib/pydantic/creation/data_field_schemas.py +230 -0
- hare/contrib/pydantic/creation/field_descriptions.py +17 -0
- hare/contrib/pydantic/creation/field_map.py +138 -0
- hare/contrib/pydantic/creation/generic_foreign_key_schemas.py +136 -0
- hare/contrib/pydantic/creation/generic_foreign_key_tag_reader.py +35 -0
- hare/contrib/pydantic/creation/model_annotations.py +44 -0
- hare/contrib/pydantic/creation/pydantic_creators.py +163 -0
- hare/contrib/pydantic/creation/pydantic_meta_reading.py +134 -0
- hare/contrib/pydantic/creation/pydantic_model_creator.py +434 -0
- hare/contrib/pydantic/creation/relation_field_schemas.py +269 -0
- hare/contrib/pydantic/descriptions/__init__.py +5 -0
- hare/contrib/pydantic/descriptions/computed_field_description.py +12 -0
- hare/contrib/pydantic/descriptions/model_description.py +69 -0
- hare/contrib/pydantic/descriptions/pydantic_meta_data.py +144 -0
- hare/contrib/pydantic/enums.py +12 -0
- hare/contrib/pydantic/models/__init__.py +9 -0
- hare/contrib/pydantic/models/pydantic_list_model.py +34 -0
- hare/contrib/pydantic/models/pydantic_model.py +292 -0
- hare/contrib/pytest/__init__.py +17 -0
- hare/contrib/pytest/constants.py +26 -0
- hare/contrib/pytest/hare_fixtures.py +112 -0
- hare/contrib/pytest/missing_pytest_asyncio_fixtures.py +34 -0
- hare/contrib/pytest/plugin.py +49 -0
- hare/contrib/repeated_queries/__init__.py +19 -0
- hare/contrib/repeated_queries/constants.py +10 -0
- hare/contrib/repeated_queries/repeated_query_collection.py +116 -0
- hare/contrib/repeated_queries/repeated_query_detector.py +227 -0
- hare/contrib/repeated_queries/repeated_query_entry.py +20 -0
- hare/contrib/repeated_queries/repeated_query_report.py +31 -0
- hare/contrib/repeated_queries/shape_stats.py +18 -0
- hare/contrib/request_query/__init__.py +71 -0
- hare/contrib/request_query/bounds/__init__.py +6 -0
- hare/contrib/request_query/bounds/constants.py +4 -0
- hare/contrib/request_query/bounds/lookup_pair_bounds.py +40 -0
- hare/contrib/request_query/bounds/parameter_bounds.py +41 -0
- hare/contrib/request_query/bounds/range_bounds.py +30 -0
- hare/contrib/request_query/constants.py +45 -0
- hare/contrib/request_query/declaration/__init__.py +6 -0
- hare/contrib/request_query/declaration/constants.py +19 -0
- hare/contrib/request_query/declaration/declaration_builder.py +515 -0
- hare/contrib/request_query/declaration/filter_declaration.py +25 -0
- hare/contrib/request_query/declaration/filter_parameter_builder.py +201 -0
- hare/contrib/request_query/declaration/parameter_filter.py +17 -0
- hare/contrib/request_query/declaration/request_query_declaration.py +138 -0
- hare/contrib/request_query/declaration/request_query_parameters.py +54 -0
- hare/contrib/request_query/declaration/request_query_registry.py +90 -0
- hare/contrib/request_query/descriptions/__init__.py +11 -0
- hare/contrib/request_query/descriptions/constants.py +11 -0
- hare/contrib/request_query/descriptions/parameter_choice.py +17 -0
- hare/contrib/request_query/descriptions/parameter_describer.py +240 -0
- hare/contrib/request_query/descriptions/parameter_description.py +66 -0
- hare/contrib/request_query/descriptions/relation_description.py +30 -0
- hare/contrib/request_query/enums.py +69 -0
- hare/contrib/request_query/exceptions.py +52 -0
- hare/contrib/request_query/options/__init__.py +33 -0
- hare/contrib/request_query/options/constants.py +25 -0
- hare/contrib/request_query/options/deleted_config.py +90 -0
- hare/contrib/request_query/options/fields_config.py +55 -0
- hare/contrib/request_query/options/filter.py +34 -0
- hare/contrib/request_query/options/filter_field.py +81 -0
- hare/contrib/request_query/options/in_path.py +12 -0
- hare/contrib/request_query/options/include_config.py +56 -0
- hare/contrib/request_query/options/latest_versions.py +71 -0
- hare/contrib/request_query/options/no_filter.py +11 -0
- hare/contrib/request_query/options/ordering_config.py +81 -0
- hare/contrib/request_query/options/parameter_field.py +27 -0
- hare/contrib/request_query/options/request_option.py +152 -0
- hare/contrib/request_query/options/search_config.py +83 -0
- hare/contrib/request_query/paginations/__init__.py +1 -0
- hare/contrib/request_query/paginations/base_offset_pagination.py +78 -0
- hare/contrib/request_query/paginations/constants.py +17 -0
- hare/contrib/request_query/paginations/cursor.py +83 -0
- hare/contrib/request_query/paginations/cursor_pagination.py +184 -0
- hare/contrib/request_query/paginations/offset_pagination.py +31 -0
- hare/contrib/request_query/paginations/pagination.py +120 -0
- hare/contrib/request_query/paginations/scroll_pagination.py +31 -0
- hare/contrib/request_query/request_query.py +1259 -0
- hare/contrib/request_query/results/__init__.py +11 -0
- hare/contrib/request_query/results/cursor_page.py +25 -0
- hare/contrib/request_query/results/page.py +25 -0
- hare/contrib/request_query/results/scroll_page.py +23 -0
- hare/contrib/request_query/row_changes.py +80 -0
- hare/contrib/request_query/types/__init__.py +15 -0
- hare/contrib/request_query/types/comma_separated.py +46 -0
- hare/contrib/request_query/types/constants.py +16 -0
- hare/contrib/request_query/types/generic_target.py +87 -0
- hare/contrib/request_query/types/key_columns.py +60 -0
- hare/contrib/request_query/types/text_parameter.py +18 -0
- hare/contrib/request_query/value_annotation.py +216 -0
- hare/contrib/request_query/value_counter.py +115 -0
- hare/contrib/request_query/value_target.py +50 -0
- hare/contrib/taskiq/__init__.py +15 -0
- hare/contrib/taskiq/constants.py +23 -0
- hare/contrib/taskiq/hare_taskiq.py +76 -0
- hare/contrib/taskiq/hare_taskiq_middleware.py +195 -0
- hare/contrib/taskiq/running_task.py +29 -0
- hare/contrib/taskiq/task_tenant_labels.py +102 -0
- hare/contrib/taskiq/taskiq_delivery.py +117 -0
- hare/contrib/test/__init__.py +39 -0
- hare/contrib/test/conditions/__init__.py +10 -0
- hare/contrib/test/conditions/condition.py +11 -0
- hare/contrib/test/conditions/in_condition.py +21 -0
- hare/contrib/test/conditions/not_eq.py +18 -0
- hare/contrib/test/conditions/not_in.py +21 -0
- hare/contrib/test/constants.py +18 -0
- hare/contrib/test/databases/__init__.py +1 -0
- hare/contrib/test/databases/kept_test_schema.py +51 -0
- hare/contrib/test/databases/model_truncation.py +128 -0
- hare/contrib/test/databases/reusable_test_databases.py +244 -0
- hare/contrib/test/databases/rollback_isolation.py +149 -0
- hare/contrib/test/databases/temporary_databases.py +118 -0
- hare/contrib/test/exceptions.py +5 -0
- hare/contrib/test/features/__init__.py +1 -0
- hare/contrib/test/features/feature_conditions.py +65 -0
- hare/contrib/test/features/feature_requirements.py +84 -0
- hare/contrib/test/isolated_contexts.py +144 -0
- hare/contrib/test/queries/__init__.py +1 -0
- hare/contrib/test/queries/query_counter.py +35 -0
- hare/contrib/test/queries/query_counting.py +59 -0
- hare/contrib/versioning/__init__.py +7 -0
- hare/contrib/versioning/constants.py +5 -0
- hare/contrib/versioning/versioned_model.py +139 -0
- hare/core/__init__.py +4 -0
- hare/core/apps/__init__.py +8 -0
- hare/core/apps/apps.py +693 -0
- hare/core/apps/cross_connection_checks.py +76 -0
- hare/core/apps/model_connection_checks.py +199 -0
- hare/core/apps/model_discovery.py +142 -0
- hare/core/apps/relation_linking.py +773 -0
- hare/core/apps/swappable_models.py +118 -0
- hare/core/apps/table_names.py +39 -0
- hare/core/caching/__init__.py +1 -0
- hare/core/caching/cache.py +426 -0
- hare/core/caching/caches.py +58 -0
- hare/core/caching/constants.py +13 -0
- hare/core/caching/declarations.py +8 -0
- hare/core/caching/forgettable_cache.py +16 -0
- hare/core/caching/model_cache.py +138 -0
- hare/core/config/__init__.py +25 -0
- hare/core/config/app_config.py +64 -0
- hare/core/config/cli_config.py +38 -0
- hare/core/config/config_secrets.py +101 -0
- hare/core/config/config_section.py +37 -0
- hare/core/config/connection_config.py +69 -0
- hare/core/config/constants.py +17 -0
- hare/core/config/db_url_config.py +24 -0
- hare/core/config/hare_config.py +407 -0
- hare/core/config/migration_safety_config.py +54 -0
- hare/core/config/migrations_config.py +72 -0
- hare/core/connections/__init__.py +1 -0
- hare/core/connections/connection_handler.py +457 -0
- hare/core/connections/connection_token.py +36 -0
- hare/core/connections/connections.py +133 -0
- hare/core/constants.py +40 -0
- hare/core/hare.py +205 -0
- hare/core/hare_context.py +854 -0
- hare/core/hare_meta.py +18 -0
- hare/core/log.py +6 -0
- hare/core/registries.py +22 -0
- hare/core/routing/__init__.py +5 -0
- hare/core/routing/connection_router.py +109 -0
- hare/core/routing/primary_reads.py +42 -0
- hare/core/routing/routing.py +28 -0
- hare/core/routing/written_connections.py +63 -0
- hare/ddl/__init__.py +57 -0
- hare/ddl/conditions/__init__.py +1 -0
- hare/ddl/conditions/constraint_condition.py +154 -0
- hare/ddl/conditions/exclusive_arc_condition.py +80 -0
- hare/ddl/conditions/tenant_condition.py +48 -0
- hare/ddl/conditions/trigger_condition.py +44 -0
- hare/ddl/constants.py +68 -0
- hare/ddl/constraints/__init__.py +7 -0
- hare/ddl/constraints/check_constraint.py +38 -0
- hare/ddl/constraints/exclusion_constraint.py +116 -0
- hare/ddl/constraints/foreign_key_constraint.py +39 -0
- hare/ddl/constraints/unique_constraint.py +150 -0
- hare/ddl/ddl_term_sql.py +45 -0
- hare/ddl/declared_names.py +47 -0
- hare/ddl/enums.py +117 -0
- hare/ddl/expressions/__init__.py +0 -0
- hare/ddl/expressions/declared_expressions.py +102 -0
- hare/ddl/expressions/expression_field_renaming.py +150 -0
- hare/ddl/generated_names.py +87 -0
- hare/ddl/indexes/__init__.py +11 -0
- hare/ddl/indexes/index.py +531 -0
- hare/ddl/indexes/ordered_index_key.py +27 -0
- hare/ddl/indexes/partial_index.py +75 -0
- hare/ddl/raw_sql_term.py +44 -0
- hare/ddl/schema_objects/__init__.py +12 -0
- hare/ddl/schema_objects/database_function.py +91 -0
- hare/ddl/schema_objects/database_sequence.py +87 -0
- hare/ddl/schema_objects/dictionary.py +69 -0
- hare/ddl/schema_objects/enum_type.py +24 -0
- hare/ddl/schema_objects/materialized_view.py +52 -0
- hare/ddl/schema_objects/named_schema_object.py +24 -0
- hare/ddl/schema_objects/trigger.py +151 -0
- hare/ddl/schema_objects/view.py +132 -0
- hare/ddl/security/__init__.py +8 -0
- hare/ddl/security/grant.py +106 -0
- hare/ddl/security/policy.py +92 -0
- hare/ddl/table_options.py +364 -0
- hare/dialects/__init__.py +0 -0
- hare/dialects/base/__init__.py +0 -0
- hare/dialects/base/clauses/__init__.py +1 -0
- hare/dialects/base/clauses/enums.py +37 -0
- hare/dialects/base/clauses/limit_returning_conflict_query_clauses.py +194 -0
- hare/dialects/base/clauses/merge_when_sql.py +24 -0
- hare/dialects/base/clauses/query_clauses.py +636 -0
- hare/dialects/base/client/__init__.py +16 -0
- hare/dialects/base/client/connect_failure_reports.py +49 -0
- hare/dialects/base/client/connection_ping.py +48 -0
- hare/dialects/base/client/connection_wrapper.py +126 -0
- hare/dialects/base/client/constants.py +41 -0
- hare/dialects/base/client/database_client.py +1187 -0
- hare/dialects/base/client/declarations.py +37 -0
- hare/dialects/base/client/driver_statement_log_filter.py +33 -0
- hare/dialects/base/client/password_provider.py +144 -0
- hare/dialects/base/client/pool/__init__.py +1 -0
- hare/dialects/base/client/pool/pool_connection_wrapper.py +37 -0
- hare/dialects/base/client/pool/pool_statistics.py +84 -0
- hare/dialects/base/client/pool/pool_timeouts.py +48 -0
- hare/dialects/base/client/transaction_client.py +621 -0
- hare/dialects/base/client/transaction_lifecycle/__init__.py +1 -0
- hare/dialects/base/client/transaction_lifecycle/pending_statements.py +74 -0
- hare/dialects/base/client/transaction_lifecycle/transaction_callbacks.py +128 -0
- hare/dialects/base/client/transaction_lifecycle/transaction_ending.py +360 -0
- hare/dialects/base/connection/__init__.py +1 -0
- hare/dialects/base/connection/connection_option.py +142 -0
- hare/dialects/base/connection/connection_options.py +69 -0
- hare/dialects/base/connection/constants.py +27 -0
- hare/dialects/base/connection/db_url_config_generator.py +194 -0
- hare/dialects/base/connection/driver.py +136 -0
- hare/dialects/base/constants.py +72 -0
- hare/dialects/base/dialect.py +360 -0
- hare/dialects/base/features.py +369 -0
- hare/dialects/base/literals/__init__.py +1 -0
- hare/dialects/base/literals/constants.py +12 -0
- hare/dialects/base/literals/sql_literals.py +254 -0
- hare/dialects/base/lookups/__init__.py +1 -0
- hare/dialects/base/lookups/filter_operators.py +171 -0
- hare/dialects/base/migration_safety/__init__.py +12 -0
- hare/dialects/base/migration_safety/add_field_backfill_rule.py +37 -0
- hare/dialects/base/migration_safety/alter_field_rewrite_rule.py +39 -0
- hare/dialects/base/migration_safety/constants.py +4 -0
- hare/dialects/base/migration_safety/delete_model_rule.py +33 -0
- hare/dialects/base/migration_safety/migration_safety_rule.py +45 -0
- hare/dialects/base/migration_safety/migration_safety_rules.py +72 -0
- hare/dialects/base/migration_safety/remove_field_rule.py +31 -0
- hare/dialects/base/migration_safety/rename_field_rule.py +41 -0
- hare/dialects/base/migration_safety/rename_model_rule.py +42 -0
- hare/dialects/base/migration_safety/run_sql_rule.py +27 -0
- hare/dialects/base/migration_safety/schema_change_with_run_python_rule.py +49 -0
- hare/dialects/base/parameters/__init__.py +1 -0
- hare/dialects/base/parameters/large_in_list.py +147 -0
- hare/dialects/base/parameters/sql_parameters.py +185 -0
- hare/dialects/base/renderers/__init__.py +7 -0
- hare/dialects/base/renderers/checked_term_renderers.py +61 -0
- hare/dialects/base/renderers/json_renderers.py +60 -0
- hare/dialects/base/renderers/term_renderers.py +508 -0
- hare/dialects/base/results/__init__.py +9 -0
- hare/dialects/base/results/described_result.py +22 -0
- hare/dialects/base/results/statement_result.py +53 -0
- hare/dialects/base/schema/__init__.py +0 -0
- hare/dialects/base/schema/base_schema_editor.py +1139 -0
- hare/dialects/base/schema/columns/__init__.py +1 -0
- hare/dialects/base/schema/columns/column_backfill.py +347 -0
- hare/dialects/base/schema/columns/column_conversion_check.py +51 -0
- hare/dialects/base/schema/columns/column_definitions.py +473 -0
- hare/dialects/base/schema/columns/column_narrowing_check.py +178 -0
- hare/dialects/base/schema/columns/column_renames.py +77 -0
- hare/dialects/base/schema/columns/column_type_changes.py +140 -0
- hare/dialects/base/schema/constants.py +30 -0
- hare/dialects/base/schema/constraints/__init__.py +1 -0
- hare/dialects/base/schema/constraints/constraint_names.py +45 -0
- hare/dialects/base/schema/constraints/constraint_statements.py +262 -0
- hare/dialects/base/schema/data/__init__.py +9 -0
- hare/dialects/base/schema/data/model_sql_data.py +41 -0
- hare/dialects/base/schema/data/referencing_key_columns.py +24 -0
- hare/dialects/base/schema/indexes/__init__.py +1 -0
- hare/dialects/base/schema/indexes/generated_index_names.py +180 -0
- hare/dialects/base/schema/indexes/index_statements.py +397 -0
- hare/dialects/base/schema/relations/__init__.py +1 -0
- hare/dialects/base/schema/relations/foreign_key_rebuild.py +480 -0
- hare/dialects/base/schema/relations/many_to_many_through_tables.py +285 -0
- hare/dialects/base/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/base/schema/runtime_statements/table_clearing.py +54 -0
- hare/dialects/base/schema/runtime_statements/table_locks.py +34 -0
- hare/dialects/base/schema/runtime_statements/tenant_conditions.py +71 -0
- hare/dialects/base/schema/schema_editor_part.py +34 -0
- hare/dialects/base/schema/schema_objects/__init__.py +1 -0
- hare/dialects/base/schema/schema_objects/database_functions.py +74 -0
- hare/dialects/base/schema/schema_objects/dictionaries.py +75 -0
- hare/dialects/base/schema/schema_objects/enum_types.py +88 -0
- hare/dialects/base/schema/schema_objects/extensions.py +69 -0
- hare/dialects/base/schema/schema_objects/grants.py +49 -0
- hare/dialects/base/schema/schema_objects/materialized_views.py +111 -0
- hare/dialects/base/schema/schema_objects/row_level_security_policies.py +82 -0
- hare/dialects/base/schema/schema_objects/schemas.py +65 -0
- hare/dialects/base/schema/schema_objects/sequences.py +95 -0
- hare/dialects/base/schema/schema_objects/views.py +81 -0
- hare/dialects/base/schema/shadow/__init__.py +0 -0
- hare/dialects/base/schema/shadow/shadow_database.py +77 -0
- hare/dialects/base/schema/tables/__init__.py +1 -0
- hare/dialects/base/schema/tables/table_comments.py +92 -0
- hare/dialects/base/schema/tables/table_creation.py +742 -0
- hare/dialects/base/schema/tables/table_partitions.py +78 -0
- hare/dialects/base/schema/tables/table_rebuild.py +268 -0
- hare/dialects/base/schema/triggers/__init__.py +1 -0
- hare/dialects/base/schema/triggers/trigger_statements.py +85 -0
- hare/dialects/base/search/__init__.py +1 -0
- hare/dialects/base/search/text_search.py +135 -0
- hare/dialects/base/sql_dialect.py +23 -0
- hare/dialects/base/transactions/__init__.py +1 -0
- hare/dialects/base/transactions/constants.py +5 -0
- hare/dialects/base/transactions/contexts/__init__.py +1 -0
- hare/dialects/base/transactions/contexts/joined_transaction_context.py +36 -0
- hare/dialects/base/transactions/contexts/nested_transaction_context.py +149 -0
- hare/dialects/base/transactions/contexts/non_transactional_context.py +32 -0
- hare/dialects/base/transactions/contexts/top_level_transaction_context.py +79 -0
- hare/dialects/base/transactions/contexts/transaction_context.py +148 -0
- hare/dialects/base/transactions/savepoints/__init__.py +1 -0
- hare/dialects/base/transactions/savepoints/nested_savepoint_lock.py +152 -0
- hare/dialects/base/transactions/savepoints/savepoint_span.py +51 -0
- hare/dialects/base/transactions/transaction_callback.py +32 -0
- hare/dialects/base/transactions/transaction_statements.py +128 -0
- hare/dialects/base/transactions/two_phase_commit.py +134 -0
- hare/dialects/base/types/__init__.py +9 -0
- hare/dialects/base/types/type_mapping.py +63 -0
- hare/dialects/base/types/type_registry.py +395 -0
- hare/dialects/clickhouse/__init__.py +1 -0
- hare/dialects/clickhouse/clauses/__init__.py +1 -0
- hare/dialects/clickhouse/clauses/clickhouse_query_clauses.py +475 -0
- hare/dialects/clickhouse/clauses/constants.py +42 -0
- hare/dialects/clickhouse/clickhouse_dialect.py +260 -0
- hare/dialects/clickhouse/clickhouse_introspector.py +414 -0
- hare/dialects/clickhouse/clickhouse_table_options.py +727 -0
- hare/dialects/clickhouse/client/__init__.py +1 -0
- hare/dialects/clickhouse/client/clickhouse_client.py +913 -0
- hare/dialects/clickhouse/client/clickhouse_connection.py +30 -0
- hare/dialects/clickhouse/client/clickhouse_error_codes.py +26 -0
- hare/dialects/clickhouse/client/clickhouse_external_sets.py +109 -0
- hare/dialects/clickhouse/client/clickhouse_query_templates.py +79 -0
- hare/dialects/clickhouse/client/clickhouse_statement_result.py +15 -0
- hare/dialects/clickhouse/client/clickhouse_streamed_row.py +52 -0
- hare/dialects/clickhouse/client/clickhouse_transaction_client.py +188 -0
- hare/dialects/clickhouse/client/constants.py +211 -0
- hare/dialects/clickhouse/client/declarations.py +47 -0
- hare/dialects/clickhouse/cluster/__init__.py +0 -0
- hare/dialects/clickhouse/cluster/clickhouse_cluster.py +162 -0
- hare/dialects/clickhouse/cluster/clickhouse_cluster_statements.py +154 -0
- hare/dialects/clickhouse/cluster/constants.py +82 -0
- hare/dialects/clickhouse/connection/__init__.py +1 -0
- hare/dialects/clickhouse/connection/clickhouse_driver.py +40 -0
- hare/dialects/clickhouse/constants.py +226 -0
- hare/dialects/clickhouse/drivers/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/clickhouse_connect_driver.py +43 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_client.py +390 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_dynamic_type.py +76 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_totals_query.py +70 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_transaction_client.py +56 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_whole_response_query.py +127 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_json_compact_values.py +96 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/constants.py +60 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/clickhouse_driver_driver.py +48 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_client.py +361 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_client_info.py +70 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_column_types.py +104 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_connections.py +189 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_decompressors.py +48 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_dynamic_column.py +51 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_library_client.py +239 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_library_connection.py +16 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_map_columns.py +49 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_moment_columns.py +85 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_query_result.py +24 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_row_stream.py +127 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_service_block_stream.py +95 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_settings.py +62 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_transaction_client.py +23 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_tuple_columns.py +38 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_variant_column.py +76 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/constants.py +133 -0
- hare/dialects/clickhouse/drivers/clickhouse_shared_variant_values.py +878 -0
- hare/dialects/clickhouse/drivers/constants.py +143 -0
- hare/dialects/clickhouse/enums.py +38 -0
- hare/dialects/clickhouse/fields/__init__.py +43 -0
- hare/dialects/clickhouse/fields/clickhouse_date_field.py +32 -0
- hare/dialects/clickhouse/fields/clickhouse_datetime_field.py +162 -0
- hare/dialects/clickhouse/fields/clickhouse_integer_field.py +20 -0
- hare/dialects/clickhouse/fields/constants.py +31 -0
- hare/dialects/clickhouse/fields/declarations.py +81 -0
- hare/dialects/clickhouse/fields/dynamic_field.py +122 -0
- hare/dialects/clickhouse/fields/fixed_string_field.py +81 -0
- hare/dialects/clickhouse/fields/float32_field.py +39 -0
- hare/dialects/clickhouse/fields/low_cardinality_field.py +72 -0
- hare/dialects/clickhouse/fields/variant_field.py +174 -0
- hare/dialects/clickhouse/functions/__init__.py +39 -0
- hare/dialects/clickhouse/functions/aggregates/__init__.py +37 -0
- hare/dialects/clickhouse/functions/aggregates/arg_extremum.py +23 -0
- hare/dialects/clickhouse/functions/aggregates/declarations.py +120 -0
- hare/dialects/clickhouse/functions/aggregates/group_array.py +48 -0
- hare/dialects/clickhouse/functions/aggregates/median.py +18 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_aggregate.py +48 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_aggregate_function.py +45 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_analytic_function.py +27 -0
- hare/dialects/clickhouse/functions/aggregates/quantile.py +74 -0
- hare/dialects/clickhouse/functions/aggregates/quantiles.py +58 -0
- hare/dialects/clickhouse/functions/aggregates/top_k.py +44 -0
- hare/dialects/clickhouse/functions/dict_get.py +199 -0
- hare/dialects/clickhouse/indexes/__init__.py +19 -0
- hare/dialects/clickhouse/indexes/bloom_filter_index.py +49 -0
- hare/dialects/clickhouse/indexes/clickhouse_index.py +145 -0
- hare/dialects/clickhouse/indexes/constants.py +14 -0
- hare/dialects/clickhouse/indexes/min_max_index.py +22 -0
- hare/dialects/clickhouse/indexes/ngram_bloom_filter_index.py +43 -0
- hare/dialects/clickhouse/indexes/set_index.py +35 -0
- hare/dialects/clickhouse/indexes/token_bloom_filter_index.py +60 -0
- hare/dialects/clickhouse/introspection/__init__.py +0 -0
- hare/dialects/clickhouse/introspection/clickhouse_check_constraints.py +40 -0
- hare/dialects/clickhouse/introspection/clickhouse_observed_table_options.py +280 -0
- hare/dialects/clickhouse/introspection/clickhouse_sql_parts.py +302 -0
- hare/dialects/clickhouse/introspection/clickhouse_type_parser.py +276 -0
- hare/dialects/clickhouse/introspection/constants.py +69 -0
- hare/dialects/clickhouse/keeper/__init__.py +0 -0
- hare/dialects/clickhouse/keeper/clickhouse_migration_lock.py +114 -0
- hare/dialects/clickhouse/keeper/constants.py +38 -0
- hare/dialects/clickhouse/keeper/keeper_codec.py +152 -0
- hare/dialects/clickhouse/keeper/keeper_session.py +213 -0
- hare/dialects/clickhouse/literals/__init__.py +1 -0
- hare/dialects/clickhouse/literals/clickhouse_literals.py +362 -0
- hare/dialects/clickhouse/lookups/__init__.py +0 -0
- hare/dialects/clickhouse/lookups/clickhouse_array_elements_key.py +32 -0
- hare/dialects/clickhouse/lookups/clickhouse_filter_operators.py +49 -0
- hare/dialects/clickhouse/lookups/clickhouse_global_lookups.py +129 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_equality.py +78 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_key_existence.py +38 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_lookups.py +57 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_path_lookups.py +102 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_value_text.py +24 -0
- hare/dialects/clickhouse/lookups/clickhouse_typed_value_lookups.py +213 -0
- hare/dialects/clickhouse/lookups/constants.py +67 -0
- hare/dialects/clickhouse/lookups/declarations.py +14 -0
- hare/dialects/clickhouse/lookups/global_contains_criterion.py +15 -0
- hare/dialects/clickhouse/lookups/in_list/__init__.py +0 -0
- hare/dialects/clickhouse/lookups/in_list/clickhouse_large_in_list.py +95 -0
- hare/dialects/clickhouse/lookups/in_list/clickhouse_value_set_values.py +45 -0
- hare/dialects/clickhouse/migration_safety/__init__.py +9 -0
- hare/dialects/clickhouse/migration_safety/clickhouse_migration_safety_rules.py +34 -0
- hare/dialects/clickhouse/migration_safety/constants.py +10 -0
- hare/dialects/clickhouse/parameters/__init__.py +1 -0
- hare/dialects/clickhouse/parameters/clickhouse_parameters.py +42 -0
- hare/dialects/clickhouse/query/__init__.py +1 -0
- hare/dialects/clickhouse/query/clickhouse_dialect_variants.py +31 -0
- hare/dialects/clickhouse/query/clickhouse_queryset_methods.py +356 -0
- hare/dialects/clickhouse/query/clickhouse_sql_context.py +47 -0
- hare/dialects/clickhouse/query/clickhouse_totals.py +34 -0
- hare/dialects/clickhouse/query/constants.py +24 -0
- hare/dialects/clickhouse/query/declarations.py +21 -0
- hare/dialects/clickhouse/query/totals_result.py +21 -0
- hare/dialects/clickhouse/renderers/__init__.py +1 -0
- hare/dialects/clickhouse/renderers/clickhouse_aggregate_renderers.py +124 -0
- hare/dialects/clickhouse/renderers/clickhouse_assigned_enum_number.py +30 -0
- hare/dialects/clickhouse/renderers/clickhouse_cast_renderers.py +49 -0
- hare/dialects/clickhouse/renderers/clickhouse_checked_integer_result.py +34 -0
- hare/dialects/clickhouse/renderers/clickhouse_condition_renderers.py +27 -0
- hare/dialects/clickhouse/renderers/clickhouse_container_renderers.py +129 -0
- hare/dialects/clickhouse/renderers/clickhouse_json_renderers.py +105 -0
- hare/dialects/clickhouse/renderers/clickhouse_json_texts.py +34 -0
- hare/dialects/clickhouse/renderers/clickhouse_number_renderers.py +76 -0
- hare/dialects/clickhouse/renderers/clickhouse_renderers.py +339 -0
- hare/dialects/clickhouse/renderers/clickhouse_temporal_renderers.py +262 -0
- hare/dialects/clickhouse/renderers/clickhouse_text_renderers.py +117 -0
- hare/dialects/clickhouse/renderers/clickhouse_value_casts.py +115 -0
- hare/dialects/clickhouse/renderers/clickhouse_window_renderers.py +72 -0
- hare/dialects/clickhouse/renderers/constants.py +341 -0
- hare/dialects/clickhouse/schema/__init__.py +1 -0
- hare/dialects/clickhouse/schema/columns/__init__.py +1 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_backfill.py +106 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_conversion_check.py +173 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_definitions.py +62 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_narrowing_check.py +109 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_renames.py +45 -0
- hare/dialects/clickhouse/schema/constants.py +201 -0
- hare/dialects/clickhouse/schema/declarations.py +95 -0
- hare/dialects/clickhouse/schema/indexes/__init__.py +0 -0
- hare/dialects/clickhouse/schema/indexes/clickhouse_index_statements.py +60 -0
- hare/dialects/clickhouse/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/clickhouse/schema/runtime_statements/clickhouse_table_clearing.py +19 -0
- hare/dialects/clickhouse/schema/schema_objects/__init__.py +0 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_dictionaries.py +169 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_materialized_views.py +221 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_schemas.py +69 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_views.py +59 -0
- hare/dialects/clickhouse/schema/shadow/__init__.py +0 -0
- hare/dialects/clickhouse/schema/shadow/clickhouse_shadow_database.py +155 -0
- hare/dialects/clickhouse/schema/tables/__init__.py +1 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_comments.py +43 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_creation.py +50 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_partitions.py +160 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_rebuild.py +227 -0
- hare/dialects/clickhouse/schema_objects/__init__.py +5 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_dictionary.py +118 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_materialized_view.py +159 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_projection.py +204 -0
- hare/dialects/clickhouse/server_versions.py +5 -0
- hare/dialects/clickhouse/spatial/__init__.py +0 -0
- hare/dialects/clickhouse/spatial/clickhouse_geometry_values.py +208 -0
- hare/dialects/clickhouse/spatial/clickhouse_spatial_renderers.py +265 -0
- hare/dialects/clickhouse/spatial/constants.py +66 -0
- hare/dialects/clickhouse/transactions/__init__.py +0 -0
- hare/dialects/clickhouse/transactions/clickhouse_transaction_statements.py +19 -0
- hare/dialects/clickhouse/types/__init__.py +1 -0
- hare/dialects/clickhouse/types/clickhouse_address_values.py +35 -0
- hare/dialects/clickhouse/types/clickhouse_binary_values.py +58 -0
- hare/dialects/clickhouse/types/clickhouse_container_values.py +267 -0
- hare/dialects/clickhouse/types/clickhouse_dynamic_values.py +307 -0
- hare/dialects/clickhouse/types/clickhouse_enum_types.py +232 -0
- hare/dialects/clickhouse/types/clickhouse_json_values.py +202 -0
- hare/dialects/clickhouse/types/clickhouse_low_cardinality_values.py +95 -0
- hare/dialects/clickhouse/types/clickhouse_nullable_types.py +27 -0
- hare/dialects/clickhouse/types/clickhouse_type_names.py +128 -0
- hare/dialects/clickhouse/types/clickhouse_types.py +258 -0
- hare/dialects/clickhouse/types/clickhouse_variant_values.py +128 -0
- hare/dialects/clickhouse/types/constants.py +139 -0
- hare/dialects/clickhouse/types/declarations.py +23 -0
- hare/dialects/constants.py +32 -0
- hare/dialects/dialect_registry.py +340 -0
- hare/dialects/enums.py +34 -0
- hare/dialects/postgresql/__init__.py +0 -0
- hare/dialects/postgresql/clauses/__init__.py +1 -0
- hare/dialects/postgresql/clauses/constants.py +44 -0
- hare/dialects/postgresql/clauses/postgresql_query_clauses.py +114 -0
- hare/dialects/postgresql/client/__init__.py +10 -0
- hare/dialects/postgresql/client/constants.py +328 -0
- hare/dialects/postgresql/client/postgresql_client.py +1224 -0
- hare/dialects/postgresql/client/postgresql_connect_errors.py +66 -0
- hare/dialects/postgresql/client/postgresql_transaction_client.py +80 -0
- hare/dialects/postgresql/client/reusable_test_schemas.py +197 -0
- hare/dialects/postgresql/client/transaction_pooler.py +137 -0
- hare/dialects/postgresql/connection/__init__.py +1 -0
- hare/dialects/postgresql/connection/constants.py +11 -0
- hare/dialects/postgresql/connection/postgresql_driver.py +99 -0
- hare/dialects/postgresql/constants.py +862 -0
- hare/dialects/postgresql/drivers/__init__.py +0 -0
- hare/dialects/postgresql/drivers/asyncpg/__init__.py +0 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_date_codec.py +81 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_driver.py +37 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_extension_type_codecs.py +78 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_hstore_codec.py +84 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_interval_codec.py +72 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_timestamp_codec.py +74 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_timestamptz_codec.py +88 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_tsvector_codec.py +264 -0
- hare/dialects/postgresql/drivers/asyncpg/client/__init__.py +9 -0
- hare/dialects/postgresql/drivers/asyncpg/client/asyncpg_client.py +738 -0
- hare/dialects/postgresql/drivers/asyncpg/client/asyncpg_transaction_client.py +197 -0
- hare/dialects/postgresql/drivers/asyncpg/constants.py +150 -0
- hare/dialects/postgresql/drivers/asyncpg/pre_epoch_local_zone.py +27 -0
- hare/dialects/postgresql/drivers/constants.py +22 -0
- hare/dialects/postgresql/drivers/rust_pg/__init__.py +0 -0
- hare/dialects/postgresql/drivers/rust_pg/client/__init__.py +9 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_client.py +461 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_transaction_client.py +306 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_transaction_connection_wrapper.py +53 -0
- hare/dialects/postgresql/drivers/rust_pg/constants.py +43 -0
- hare/dialects/postgresql/drivers/rust_pg/rust_pg_driver.py +66 -0
- hare/dialects/postgresql/enums.py +99 -0
- hare/dialects/postgresql/fields/__init__.py +68 -0
- hare/dialects/postgresql/fields/citext_field.py +42 -0
- hare/dialects/postgresql/fields/constants.py +115 -0
- hare/dialects/postgresql/fields/fixed_char_field.py +23 -0
- hare/dialects/postgresql/fields/hstore/__init__.py +5 -0
- hare/dialects/postgresql/fields/hstore/h_store_field.py +105 -0
- hare/dialects/postgresql/fields/hstore/h_store_text.py +86 -0
- hare/dialects/postgresql/fields/interval_field.py +31 -0
- hare/dialects/postgresql/fields/ltree_field.py +98 -0
- hare/dialects/postgresql/fields/multiranges/__init__.py +19 -0
- hare/dialects/postgresql/fields/multiranges/declarations.py +55 -0
- hare/dialects/postgresql/fields/multiranges/multi_range_field.py +326 -0
- hare/dialects/postgresql/fields/naive_datetime_field.py +74 -0
- hare/dialects/postgresql/fields/naive_time_field.py +64 -0
- hare/dialects/postgresql/fields/native_enum/__init__.py +5 -0
- hare/dialects/postgresql/fields/native_enum/native_enum_field.py +23 -0
- hare/dialects/postgresql/fields/native_enum/native_enum_field_instance.py +87 -0
- hare/dialects/postgresql/fields/network/__init__.py +7 -0
- hare/dialects/postgresql/fields/network/cidr_field.py +24 -0
- hare/dialects/postgresql/fields/network/inet_field.py +25 -0
- hare/dialects/postgresql/fields/network/mac_address_field.py +59 -0
- hare/dialects/postgresql/fields/network/network_field.py +80 -0
- hare/dialects/postgresql/fields/postgis_field.py +206 -0
- hare/dialects/postgresql/fields/ranges/__init__.py +19 -0
- hare/dialects/postgresql/fields/ranges/date_range_field.py +48 -0
- hare/dialects/postgresql/fields/ranges/date_time_range_field.py +153 -0
- hare/dialects/postgresql/fields/ranges/decimal_range_field.py +42 -0
- hare/dialects/postgresql/fields/ranges/declarations.py +15 -0
- hare/dialects/postgresql/fields/ranges/int_range_field.py +60 -0
- hare/dialects/postgresql/fields/ranges/range.py +26 -0
- hare/dialects/postgresql/fields/ranges/range_field.py +349 -0
- hare/dialects/postgresql/fields/ts_vector_field.py +143 -0
- hare/dialects/postgresql/functions/__init__.py +72 -0
- hare/dialects/postgresql/functions/aggregates/__init__.py +21 -0
- hare/dialects/postgresql/functions/aggregates/declarations.py +67 -0
- hare/dialects/postgresql/functions/aggregates/jsonb_agg.py +35 -0
- hare/dialects/postgresql/functions/aggregates/jsonb_agg_field.py +29 -0
- hare/dialects/postgresql/functions/aggregates/range_agg.py +22 -0
- hare/dialects/postgresql/functions/aggregates/string_agg.py +101 -0
- hare/dialects/postgresql/functions/aggregates/string_agg_function.py +13 -0
- hare/dialects/postgresql/functions/array/__init__.py +13 -0
- hare/dialects/postgresql/functions/array/any_value.py +13 -0
- hare/dialects/postgresql/functions/array/array_slice.py +28 -0
- hare/dialects/postgresql/functions/array/array_subquery.py +62 -0
- hare/dialects/postgresql/functions/array/array_subscript.py +66 -0
- hare/dialects/postgresql/functions/constants.py +8 -0
- hare/dialects/postgresql/functions/ltree/__init__.py +7 -0
- hare/dialects/postgresql/functions/ltree/subpath.py +54 -0
- hare/dialects/postgresql/functions/random_uuid.py +26 -0
- hare/dialects/postgresql/functions/spatial/__init__.py +9 -0
- hare/dialects/postgresql/functions/spatial/st_distance.py +63 -0
- hare/dialects/postgresql/functions/spatial/std_within.py +46 -0
- hare/dialects/postgresql/functions/statistics/__init__.py +31 -0
- hare/dialects/postgresql/functions/statistics/covar_pop.py +49 -0
- hare/dialects/postgresql/functions/statistics/declarations.py +84 -0
- hare/dialects/postgresql/functions/statistics/regr_count.py +21 -0
- hare/dialects/postgresql/functions/statistics/statistic_pair_aggregate.py +55 -0
- hare/dialects/postgresql/functions/transaction_now.py +27 -0
- hare/dialects/postgresql/functions/trigram/__init__.py +21 -0
- hare/dialects/postgresql/functions/trigram/declarations.py +53 -0
- hare/dialects/postgresql/functions/trigram/trigram_function.py +61 -0
- hare/dialects/postgresql/functions/trigram/trigram_word_similarity.py +19 -0
- hare/dialects/postgresql/indexes/__init__.py +25 -0
- hare/dialects/postgresql/indexes/constants.py +16 -0
- hare/dialects/postgresql/indexes/declarations.py +36 -0
- hare/dialects/postgresql/indexes/hnsw_index.py +63 -0
- hare/dialects/postgresql/indexes/ivfflat_index.py +37 -0
- hare/dialects/postgresql/indexes/postgresql_index.py +112 -0
- hare/dialects/postgresql/introspection/__init__.py +0 -0
- hare/dialects/postgresql/introspection/postgresql_array_literals.py +101 -0
- hare/dialects/postgresql/introspection/postgresql_definitions.py +193 -0
- hare/dialects/postgresql/introspection/postgresql_inspected_schema_objects.py +196 -0
- hare/dialects/postgresql/introspection/postgresql_object_parts.py +102 -0
- hare/dialects/postgresql/literals/__init__.py +1 -0
- hare/dialects/postgresql/literals/postgresql_literals.py +99 -0
- hare/dialects/postgresql/lookups/__init__.py +0 -0
- hare/dialects/postgresql/lookups/array/__init__.py +5 -0
- hare/dialects/postgresql/lookups/array/array_length.py +26 -0
- hare/dialects/postgresql/lookups/constants.py +44 -0
- hare/dialects/postgresql/lookups/hstore/__init__.py +11 -0
- hare/dialects/postgresql/lookups/hstore/h_store_value_term.py +18 -0
- hare/dialects/postgresql/lookups/hstore/postgresql_h_store_field_lookups.py +75 -0
- hare/dialects/postgresql/lookups/hstore/postgresql_h_store_lookups.py +38 -0
- hare/dialects/postgresql/lookups/in_list/__init__.py +11 -0
- hare/dialects/postgresql/lookups/in_list/array_parameter.py +104 -0
- hare/dialects/postgresql/lookups/in_list/postgresql_large_in_list.py +78 -0
- hare/dialects/postgresql/lookups/in_list/unnest_row_values.py +32 -0
- hare/dialects/postgresql/lookups/json/__init__.py +9 -0
- hare/dialects/postgresql/lookups/json/postgresql_json_filter_guards.py +111 -0
- hare/dialects/postgresql/lookups/json/postgresql_json_lookups.py +59 -0
- hare/dialects/postgresql/lookups/ltree/__init__.py +9 -0
- hare/dialects/postgresql/lookups/ltree/postgresql_ltree_field_lookups.py +54 -0
- hare/dialects/postgresql/lookups/ltree/postgresql_ltree_lookups.py +35 -0
- hare/dialects/postgresql/lookups/multiranges/__init__.py +9 -0
- hare/dialects/postgresql/lookups/multiranges/postgresql_multi_range_field_lookups.py +50 -0
- hare/dialects/postgresql/lookups/network/__init__.py +1 -0
- hare/dialects/postgresql/lookups/network/postgresql_network_field_lookups.py +46 -0
- hare/dialects/postgresql/lookups/network/postgresql_network_lookups.py +35 -0
- hare/dialects/postgresql/lookups/postgresql_filter_operators.py +96 -0
- hare/dialects/postgresql/lookups/postgresql_regex_lookups.py +22 -0
- hare/dialects/postgresql/lookups/postgresql_value_encoders.py +163 -0
- hare/dialects/postgresql/lookups/ranges/__init__.py +9 -0
- hare/dialects/postgresql/lookups/ranges/postgresql_range_field_lookups.py +49 -0
- hare/dialects/postgresql/lookups/ranges/postgresql_range_lookups.py +49 -0
- hare/dialects/postgresql/lookups/trigram/__init__.py +1 -0
- hare/dialects/postgresql/lookups/trigram/postgresql_trigram_lookups.py +69 -0
- hare/dialects/postgresql/lookups/trigram/trigram_operator_term.py +16 -0
- hare/dialects/postgresql/lookups/unaccent_transform.py +39 -0
- hare/dialects/postgresql/migration_safety/__init__.py +9 -0
- hare/dialects/postgresql/migration_safety/check_constraint_validation_rule.py +36 -0
- hare/dialects/postgresql/migration_safety/constants.py +18 -0
- hare/dialects/postgresql/migration_safety/foreign_key_validation_rule.py +74 -0
- hare/dialects/postgresql/migration_safety/index_without_concurrently_rule.py +45 -0
- hare/dialects/postgresql/migration_safety/postgresql_migration_safety_rules.py +59 -0
- hare/dialects/postgresql/migration_safety/set_not_null_rule.py +47 -0
- hare/dialects/postgresql/migration_safety/unique_constraint_index_rule.py +65 -0
- hare/dialects/postgresql/migration_safety/volatile_default_rule.py +40 -0
- hare/dialects/postgresql/parameters/__init__.py +1 -0
- hare/dialects/postgresql/parameters/constants.py +83 -0
- hare/dialects/postgresql/parameters/postgresql_parameters.py +86 -0
- hare/dialects/postgresql/partitioning/__init__.py +23 -0
- hare/dialects/postgresql/partitioning/constants.py +56 -0
- hare/dialects/postgresql/partitioning/explicit_partitioning.py +97 -0
- hare/dialects/postgresql/partitioning/hash_partitioning.py +50 -0
- hare/dialects/postgresql/partitioning/list_partitioning.py +55 -0
- hare/dialects/postgresql/partitioning/observed_partitioning.py +205 -0
- hare/dialects/postgresql/partitioning/partitioning.py +280 -0
- hare/dialects/postgresql/partitioning/partitions/__init__.py +1 -0
- hare/dialects/postgresql/partitioning/partitions/default_partition.py +30 -0
- hare/dialects/postgresql/partitioning/partitions/list_partition.py +36 -0
- hare/dialects/postgresql/partitioning/partitions/partition.py +46 -0
- hare/dialects/postgresql/partitioning/partitions/range_partition.py +94 -0
- hare/dialects/postgresql/partitioning/range_partitioning.py +60 -0
- hare/dialects/postgresql/postgresql_dialect.py +207 -0
- hare/dialects/postgresql/postgresql_introspector.py +1055 -0
- hare/dialects/postgresql/postgresql_table_options.py +165 -0
- hare/dialects/postgresql/query/__init__.py +7 -0
- hare/dialects/postgresql/query/declarations.py +13 -0
- hare/dialects/postgresql/renderers/__init__.py +7 -0
- hare/dialects/postgresql/renderers/constants.py +43 -0
- hare/dialects/postgresql/renderers/postgresql_container_renderers.py +90 -0
- hare/dialects/postgresql/renderers/postgresql_defaults.py +88 -0
- hare/dialects/postgresql/renderers/postgresql_json_renderers.py +57 -0
- hare/dialects/postgresql/renderers/postgresql_number_renderers.py +58 -0
- hare/dialects/postgresql/renderers/postgresql_renderers.py +82 -0
- hare/dialects/postgresql/renderers/postgresql_temporal_renderers.py +179 -0
- hare/dialects/postgresql/renderers/postgresql_text_renderers.py +67 -0
- hare/dialects/postgresql/request_query/__init__.py +8 -0
- hare/dialects/postgresql/request_query/declarations.py +17 -0
- hare/dialects/postgresql/schema/__init__.py +0 -0
- hare/dialects/postgresql/schema/columns/__init__.py +1 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_backfill.py +13 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_narrowing_check.py +42 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_type_changes.py +129 -0
- hare/dialects/postgresql/schema/constants.py +384 -0
- hare/dialects/postgresql/schema/constraints/__init__.py +1 -0
- hare/dialects/postgresql/schema/constraints/postgresql_constraint_statements.py +119 -0
- hare/dialects/postgresql/schema/indexes/__init__.py +1 -0
- hare/dialects/postgresql/schema/indexes/postgresql_index_statements.py +24 -0
- hare/dialects/postgresql/schema/postgresql_schema_editor.py +280 -0
- hare/dialects/postgresql/schema/relations/__init__.py +1 -0
- hare/dialects/postgresql/schema/relations/postgresql_foreign_key_rebuild.py +230 -0
- hare/dialects/postgresql/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_foreign_key_deferral.py +109 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_table_clearing.py +80 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_table_locks.py +27 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_tenant_conditions.py +34 -0
- hare/dialects/postgresql/schema/schema_objects/__init__.py +1 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_database_functions.py +95 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_enum_types.py +130 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_extensions.py +35 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_grants.py +89 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_materialized_views.py +107 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_row_level_security_policies.py +125 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_schemas.py +51 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_sequences.py +132 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_views.py +53 -0
- hare/dialects/postgresql/schema/shadow/__init__.py +0 -0
- hare/dialects/postgresql/schema/shadow/postgresql_shadow_database.py +78 -0
- hare/dialects/postgresql/schema/tables/__init__.py +1 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_comments.py +74 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_partitions.py +229 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_rebuild.py +118 -0
- hare/dialects/postgresql/schema/triggers/__init__.py +1 -0
- hare/dialects/postgresql/schema/triggers/postgresql_trigger_statements.py +141 -0
- hare/dialects/postgresql/search/__init__.py +8 -0
- hare/dialects/postgresql/search/constants.py +43 -0
- hare/dialects/postgresql/search/criterion/__init__.py +14 -0
- hare/dialects/postgresql/search/criterion/declarations.py +14 -0
- hare/dialects/postgresql/search/criterion/search_criterion.py +62 -0
- hare/dialects/postgresql/search/criterion/ts_query_function.py +20 -0
- hare/dialects/postgresql/search/criterion/ts_query_invert.py +32 -0
- hare/dialects/postgresql/search/enums.py +12 -0
- hare/dialects/postgresql/search/functions/__init__.py +9 -0
- hare/dialects/postgresql/search/functions/plain_to_ts_query.py +18 -0
- hare/dialects/postgresql/search/functions/to_ts_vector.py +20 -0
- hare/dialects/postgresql/search/lexemes/__init__.py +1 -0
- hare/dialects/postgresql/search/lexemes/combined_lexeme.py +35 -0
- hare/dialects/postgresql/search/lexemes/lexeme.py +77 -0
- hare/dialects/postgresql/search/lexemes/lexeme_combinable.py +59 -0
- hare/dialects/postgresql/search/postgresql_text_search.py +237 -0
- hare/dialects/postgresql/search/ts_vector_expression_reader.py +106 -0
- hare/dialects/postgresql/server_versions.py +26 -0
- hare/dialects/postgresql/spatial/__init__.py +7 -0
- hare/dialects/postgresql/spatial/constants.py +118 -0
- hare/dialects/postgresql/spatial/postgresql_spatial_renderers.py +102 -0
- hare/dialects/postgresql/transactions/__init__.py +1 -0
- hare/dialects/postgresql/transactions/constants.py +21 -0
- hare/dialects/postgresql/transactions/postgresql_transaction_statements.py +40 -0
- hare/dialects/postgresql/transactions/postgresql_two_phase_commit.py +87 -0
- hare/dialects/postgresql/types/__init__.py +1 -0
- hare/dialects/postgresql/types/postgresql_container_values.py +104 -0
- hare/dialects/postgresql/types/postgresql_types.py +213 -0
- hare/dialects/postgresql/validators/__init__.py +15 -0
- hare/dialects/postgresql/validators/keys_validator.py +32 -0
- hare/dialects/postgresql/validators/range_bound_validator.py +33 -0
- hare/dialects/postgresql/validators/range_max_value_validator.py +17 -0
- hare/dialects/postgresql/validators/range_min_value_validator.py +17 -0
- hare/dialects/postgresql/vectors/__init__.py +1 -0
- hare/dialects/postgresql/vectors/constants.py +13 -0
- hare/dialects/postgresql/vectors/postgresql_vector_renderers.py +40 -0
- hare/dialects/postgresql/vectors/postgresql_vector_values.py +94 -0
- hare/dialects/sqlite/__init__.py +0 -0
- hare/dialects/sqlite/clauses/__init__.py +1 -0
- hare/dialects/sqlite/clauses/constants.py +7 -0
- hare/dialects/sqlite/clauses/sqlite_query_clauses.py +100 -0
- hare/dialects/sqlite/client/__init__.py +12 -0
- hare/dialects/sqlite/client/constants.py +103 -0
- hare/dialects/sqlite/client/declarations.py +27 -0
- hare/dialects/sqlite/client/sqlite_client.py +507 -0
- hare/dialects/sqlite/client/sqlite_migration_lock.py +76 -0
- hare/dialects/sqlite/client/sqlite_transaction_client.py +160 -0
- hare/dialects/sqlite/connection/__init__.py +1 -0
- hare/dialects/sqlite/connection/constants.py +7 -0
- hare/dialects/sqlite/connection/sqlite_driver.py +59 -0
- hare/dialects/sqlite/constants.py +451 -0
- hare/dialects/sqlite/drivers/__init__.py +1 -0
- hare/dialects/sqlite/drivers/aiosqlite/__init__.py +1 -0
- hare/dialects/sqlite/drivers/aiosqlite/aiosqlite_driver.py +41 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/__init__.py +23 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_client.py +428 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_client_with_regexp_support.py +16 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_connection_wrapper.py +62 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_statement_timeout_connection_wrapper.py +53 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_transaction_client.py +176 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_transaction_connection_wrapper.py +23 -0
- hare/dialects/sqlite/drivers/aiosqlite/constants.py +11 -0
- hare/dialects/sqlite/drivers/constants.py +19 -0
- hare/dialects/sqlite/enums.py +37 -0
- hare/dialects/sqlite/exceptions.py +10 -0
- hare/dialects/sqlite/functions/__init__.py +0 -0
- hare/dialects/sqlite/functions/comparison/__init__.py +11 -0
- hare/dialects/sqlite/functions/comparison/sqlite_cast.py +204 -0
- hare/dialects/sqlite/functions/comparison/sqlite_greatest_least.py +63 -0
- hare/dialects/sqlite/functions/constants.py +102 -0
- hare/dialects/sqlite/functions/datetime/__init__.py +13 -0
- hare/dialects/sqlite/functions/datetime/date_truncation.py +115 -0
- hare/dialects/sqlite/functions/datetime/sqlite_date_part_extraction.py +77 -0
- hare/dialects/sqlite/functions/datetime/sqlite_date_timestamp.py +48 -0
- hare/dialects/sqlite/functions/datetime/sqlite_local_now.py +54 -0
- hare/dialects/sqlite/functions/datetime/temporal_arithmetic_functions.py +147 -0
- hare/dialects/sqlite/functions/decimal/__init__.py +1 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_arithmetic.py +152 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_average.py +23 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_collation.py +125 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_comparand.py +23 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_operation.py +33 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_round.py +50 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_storage.py +77 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_sum.py +62 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_text.py +22 -0
- hare/dialects/sqlite/functions/decimal/sqlite_stored_decimal.py +29 -0
- hare/dialects/sqlite/functions/json/__init__.py +9 -0
- hare/dialects/sqlite/functions/json/sqlite_json_datetime.py +124 -0
- hare/dialects/sqlite/functions/json/sqlite_json_path.py +116 -0
- hare/dialects/sqlite/functions/regex/__init__.py +5 -0
- hare/dialects/sqlite/functions/regex/sqlite_posix_regex.py +102 -0
- hare/dialects/sqlite/functions/regex/sqlite_regex_criterion.py +18 -0
- hare/dialects/sqlite/functions/sqlite_checked_integer.py +15 -0
- hare/dialects/sqlite/functions/sqlite_collation.py +51 -0
- hare/dialects/sqlite/functions/sqlite_connection_function.py +17 -0
- hare/dialects/sqlite/functions/sqlite_function_errors.py +45 -0
- hare/dialects/sqlite/functions/sqlite_integer_range.py +48 -0
- hare/dialects/sqlite/functions/sqlite_math_functions.py +233 -0
- hare/dialects/sqlite/functions/sqlite_native_functions.py +12 -0
- hare/dialects/sqlite/functions/sqlite_sort_keys.py +58 -0
- hare/dialects/sqlite/functions/statistics/__init__.py +19 -0
- hare/dialects/sqlite/functions/statistics/declarations.py +31 -0
- hare/dialects/sqlite/functions/statistics/sqlite_statistic.py +118 -0
- hare/dialects/sqlite/functions/statistics/sqlite_statistics.py +51 -0
- hare/dialects/sqlite/functions/text/__init__.py +1 -0
- hare/dialects/sqlite/functions/text/sqlite_text_functions.py +140 -0
- hare/dialects/sqlite/indexes/__init__.py +7 -0
- hare/dialects/sqlite/indexes/constants.py +45 -0
- hare/dialects/sqlite/indexes/full_text_index.py +228 -0
- hare/dialects/sqlite/indexes/separate_table_index.py +105 -0
- hare/dialects/sqlite/indexes/spatialite_index.py +228 -0
- hare/dialects/sqlite/literals/__init__.py +1 -0
- hare/dialects/sqlite/literals/sqlite_literals.py +51 -0
- hare/dialects/sqlite/lookups/__init__.py +0 -0
- hare/dialects/sqlite/lookups/constants.py +18 -0
- hare/dialects/sqlite/lookups/in_list/__init__.py +11 -0
- hare/dialects/sqlite/lookups/in_list/json_array_row_values.py +39 -0
- hare/dialects/sqlite/lookups/in_list/json_array_values.py +116 -0
- hare/dialects/sqlite/lookups/in_list/sqlite_large_in_list.py +96 -0
- hare/dialects/sqlite/lookups/json/__init__.py +1 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_filter_guards.py +128 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_lookups.py +51 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_path_lookups.py +56 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_type_criterion.py +13 -0
- hare/dialects/sqlite/lookups/sqlite_filter_operators.py +89 -0
- hare/dialects/sqlite/migration_safety/__init__.py +9 -0
- hare/dialects/sqlite/migration_safety/sqlite_migration_safety_rules.py +32 -0
- hare/dialects/sqlite/parameters/__init__.py +1 -0
- hare/dialects/sqlite/parameters/constants.py +11 -0
- hare/dialects/sqlite/parameters/sqlite_parameter_adapters.py +61 -0
- hare/dialects/sqlite/parameters/sqlite_parameters.py +27 -0
- hare/dialects/sqlite/query/__init__.py +7 -0
- hare/dialects/sqlite/query/declarations.py +13 -0
- hare/dialects/sqlite/renderers/__init__.py +7 -0
- hare/dialects/sqlite/renderers/constants.py +43 -0
- hare/dialects/sqlite/renderers/sqlite_defaults.py +84 -0
- hare/dialects/sqlite/renderers/sqlite_json_renderers.py +142 -0
- hare/dialects/sqlite/renderers/sqlite_number_renderers.py +137 -0
- hare/dialects/sqlite/renderers/sqlite_renderers.py +235 -0
- hare/dialects/sqlite/renderers/sqlite_temporal_renderers.py +138 -0
- hare/dialects/sqlite/renderers/sqlite_text_renderers.py +60 -0
- hare/dialects/sqlite/request_query/__init__.py +8 -0
- hare/dialects/sqlite/request_query/declarations.py +16 -0
- hare/dialects/sqlite/schema/__init__.py +0 -0
- hare/dialects/sqlite/schema/columns/__init__.py +1 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_backfill.py +29 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_conversion_check.py +181 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_narrowing_check.py +24 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_type_changes.py +148 -0
- hare/dialects/sqlite/schema/constants.py +108 -0
- hare/dialects/sqlite/schema/constraints/__init__.py +1 -0
- hare/dialects/sqlite/schema/constraints/sqlite_constraint_statements.py +32 -0
- hare/dialects/sqlite/schema/indexes/__init__.py +1 -0
- hare/dialects/sqlite/schema/indexes/sqlite_generated_index_names.py +61 -0
- hare/dialects/sqlite/schema/indexes/sqlite_index_statements.py +78 -0
- hare/dialects/sqlite/schema/relations/__init__.py +1 -0
- hare/dialects/sqlite/schema/relations/sqlite_foreign_key_rebuild.py +100 -0
- hare/dialects/sqlite/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_foreign_key_deferral.py +87 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_table_clearing.py +39 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_tenant_conditions.py +21 -0
- hare/dialects/sqlite/schema/shadow/__init__.py +0 -0
- hare/dialects/sqlite/schema/shadow/sqlite_shadow_database.py +36 -0
- hare/dialects/sqlite/schema/sqlite_schema_editor.py +492 -0
- hare/dialects/sqlite/schema/tables/__init__.py +1 -0
- hare/dialects/sqlite/schema/tables/sqlite_table_comments.py +32 -0
- hare/dialects/sqlite/schema/tables/sqlite_table_rebuild.py +164 -0
- hare/dialects/sqlite/schema/triggers/__init__.py +1 -0
- hare/dialects/sqlite/schema/triggers/sqlite_trigger_statements.py +70 -0
- hare/dialects/sqlite/search/__init__.py +8 -0
- hare/dialects/sqlite/search/constants.py +33 -0
- hare/dialects/sqlite/search/sqlite_full_text_query.py +137 -0
- hare/dialects/sqlite/search/sqlite_search_renderers.py +33 -0
- hare/dialects/sqlite/search/sqlite_text_search.py +308 -0
- hare/dialects/sqlite/search/terms/__init__.py +1 -0
- hare/dialects/sqlite/search/terms/full_text_headline.py +56 -0
- hare/dialects/sqlite/search/terms/full_text_match.py +73 -0
- hare/dialects/sqlite/search/terms/full_text_query.py +42 -0
- hare/dialects/sqlite/search/terms/full_text_query_combination.py +82 -0
- hare/dialects/sqlite/search/terms/full_text_rank.py +34 -0
- hare/dialects/sqlite/search/terms/full_text_row_value.py +104 -0
- hare/dialects/sqlite/server_versions.py +17 -0
- hare/dialects/sqlite/spatial/__init__.py +0 -0
- hare/dialects/sqlite/spatial/constants.py +173 -0
- hare/dialects/sqlite/spatial/spatialite_blob_reader.py +166 -0
- hare/dialects/sqlite/spatial/spatialite_blob_writer.py +105 -0
- hare/dialects/sqlite/spatial/sqlite_geometry_values.py +75 -0
- hare/dialects/sqlite/spatial/sqlite_spatial_extension.py +116 -0
- hare/dialects/sqlite/spatial/sqlite_spatial_renderers.py +202 -0
- hare/dialects/sqlite/sqlite_dialect.py +138 -0
- hare/dialects/sqlite/sqlite_introspector.py +1025 -0
- hare/dialects/sqlite/sqlite_table_options.py +92 -0
- hare/dialects/sqlite/table_option_constants.py +15 -0
- hare/dialects/sqlite/transactions/__init__.py +1 -0
- hare/dialects/sqlite/transactions/constants.py +10 -0
- hare/dialects/sqlite/transactions/sqlite_transaction_statements.py +19 -0
- hare/dialects/sqlite/types/__init__.py +1 -0
- hare/dialects/sqlite/types/sqlite_types.py +87 -0
- hare/dialects/sqlite/vectors/__init__.py +1 -0
- hare/dialects/sqlite/vectors/constants.py +16 -0
- hare/dialects/sqlite/vectors/sqlite_vector_extension.py +112 -0
- hare/dialects/sqlite/vectors/sqlite_vector_renderers.py +55 -0
- hare/dialects/sqlite/vectors/sqlite_vector_values.py +113 -0
- hare/exceptions.py +397 -0
- hare/fields/__init__.py +133 -0
- hare/fields/composite_primary_key.py +40 -0
- hare/fields/constants.py +120 -0
- hare/fields/data/__init__.py +3 -0
- hare/fields/data/binary_field.py +62 -0
- hare/fields/data/boolean_field.py +57 -0
- hare/fields/data/choices/__init__.py +16 -0
- hare/fields/data/choices/char_enum_field.py +27 -0
- hare/fields/data/choices/char_enum_field_instance.py +117 -0
- hare/fields/data/choices/int_enum_field.py +23 -0
- hare/fields/data/choices/int_enum_field_instance.py +102 -0
- hare/fields/data/constants.py +122 -0
- hare/fields/data/containers/__init__.py +10 -0
- hare/fields/data/containers/array_field.py +152 -0
- hare/fields/data/containers/constants.py +25 -0
- hare/fields/data/containers/container_field.py +342 -0
- hare/fields/data/containers/declarations.py +13 -0
- hare/fields/data/containers/map_field.py +165 -0
- hare/fields/data/containers/nested_field.py +47 -0
- hare/fields/data/containers/tuple_field.py +177 -0
- hare/fields/data/json/__init__.py +7 -0
- hare/fields/data/json/json_codec.py +152 -0
- hare/fields/data/json/json_field.py +387 -0
- hare/fields/data/json/json_path_field.py +77 -0
- hare/fields/data/json/json_text_field.py +13 -0
- hare/fields/data/network/__init__.py +8 -0
- hare/fields/data/network/constants.py +6 -0
- hare/fields/data/network/ip_address_field.py +109 -0
- hare/fields/data/network/ipv4_address_field.py +26 -0
- hare/fields/data/numeric/__init__.py +23 -0
- hare/fields/data/numeric/big_int_field.py +22 -0
- hare/fields/data/numeric/decimal_field.py +187 -0
- hare/fields/data/numeric/float_field.py +83 -0
- hare/fields/data/numeric/int_field.py +239 -0
- hare/fields/data/numeric/positive_big_int_field.py +19 -0
- hare/fields/data/numeric/positive_int_field.py +19 -0
- hare/fields/data/numeric/positive_small_int_field.py +19 -0
- hare/fields/data/numeric/small_int_field.py +22 -0
- hare/fields/data/temporal/__init__.py +11 -0
- hare/fields/data/temporal/date_field.py +87 -0
- hare/fields/data/temporal/datetime_field.py +384 -0
- hare/fields/data/temporal/parse_datetime.py +17 -0
- hare/fields/data/temporal/temporal_values.py +119 -0
- hare/fields/data/temporal/time_delta_field.py +111 -0
- hare/fields/data/temporal/time_field.py +193 -0
- hare/fields/data/text/__init__.py +20 -0
- hare/fields/data/text/char_field.py +78 -0
- hare/fields/data/text/email_field.py +76 -0
- hare/fields/data/text/phone_field.py +114 -0
- hare/fields/data/text/slug_field.py +52 -0
- hare/fields/data/text/text_field.py +33 -0
- hare/fields/data/text/text_values.py +39 -0
- hare/fields/data/text/url_field.py +62 -0
- hare/fields/data/uuid_field.py +82 -0
- hare/fields/database_default.py +28 -0
- hare/fields/db_default_not_set.py +36 -0
- hare/fields/db_defaults/__init__.py +13 -0
- hare/fields/db_defaults/now.py +108 -0
- hare/fields/db_defaults/random_hex.py +30 -0
- hare/fields/db_defaults/sql_default.py +95 -0
- hare/fields/db_defaults/uuid_v7.py +36 -0
- hare/fields/encrypted/__init__.py +7 -0
- hare/fields/encrypted/blind_index_field.py +49 -0
- hare/fields/encrypted/constants.py +41 -0
- hare/fields/encrypted/encrypted_field_base.py +143 -0
- hare/fields/encrypted/encrypted_json_field.py +238 -0
- hare/fields/encrypted/encrypted_text_field.py +130 -0
- hare/fields/encrypted/field_encryption.py +267 -0
- hare/fields/enums.py +91 -0
- hare/fields/field.py +1231 -0
- hare/fields/field_meta.py +16 -0
- hare/fields/generated_field.py +211 -0
- hare/fields/narrowing/__init__.py +7 -0
- hare/fields/narrowing/decimal_digits_limit.py +11 -0
- hare/fields/narrowing/enum_values_limit.py +32 -0
- hare/fields/narrowing/integer_range_limit.py +13 -0
- hare/fields/narrowing/narrowing_limit.py +8 -0
- hare/fields/narrowing/text_length_limit.py +13 -0
- hare/fields/registrations/__init__.py +1 -0
- hare/fields/registrations/registered_lookup.py +29 -0
- hare/fields/registrations/registered_transform.py +22 -0
- hare/fields/relations/__init__.py +3 -0
- hare/fields/relations/constants.py +10 -0
- hare/fields/relations/declarations.py +5 -0
- hare/fields/relations/fields/__init__.py +35 -0
- hare/fields/relations/fields/backward_foreign_key_relation.py +46 -0
- hare/fields/relations/fields/declarations.py +21 -0
- hare/fields/relations/fields/foreign_key_field.py +89 -0
- hare/fields/relations/fields/foreign_key_field_instance.py +124 -0
- hare/fields/relations/fields/generic_foreign_key_field.py +56 -0
- hare/fields/relations/fields/generic_foreign_key_field_instance.py +455 -0
- hare/fields/relations/fields/many_to_many_field.py +60 -0
- hare/fields/relations/fields/many_to_many_field_instance.py +126 -0
- hare/fields/relations/fields/one_to_one_field.py +89 -0
- hare/fields/relations/fields/one_to_one_field_instance.py +45 -0
- hare/fields/relations/fields/relational_field.py +153 -0
- hare/fields/relations/inherited_relation.py +30 -0
- hare/fields/relations/relation_accessors.py +271 -0
- hare/fields/relations/relation_values.py +106 -0
- hare/fields/relations/swappable_model_reference.py +60 -0
- hare/fields/validators/__init__.py +63 -0
- hare/fields/validators/exceptions.py +52 -0
- hare/fields/validators/formats/__init__.py +1 -0
- hare/fields/validators/formats/comma_separated_integer_list_validator.py +22 -0
- hare/fields/validators/formats/domain_name_validator.py +74 -0
- hare/fields/validators/formats/e164_phone_validator.py +32 -0
- hare/fields/validators/formats/email_validator.py +87 -0
- hare/fields/validators/formats/ipv46_validator.py +28 -0
- hare/fields/validators/formats/ipv4_validator.py +23 -0
- hare/fields/validators/formats/ipv6_validator.py +23 -0
- hare/fields/validators/formats/regex_validator.py +38 -0
- hare/fields/validators/formats/slug_validator.py +36 -0
- hare/fields/validators/formats/url_validator.py +95 -0
- hare/fields/validators/limits/__init__.py +1 -0
- hare/fields/validators/limits/length_validator.py +17 -0
- hare/fields/validators/limits/max_digits_validator.py +58 -0
- hare/fields/validators/limits/max_length_validator.py +20 -0
- hare/fields/validators/limits/max_value_validator.py +19 -0
- hare/fields/validators/limits/min_length_validator.py +20 -0
- hare/fields/validators/limits/min_value_validator.py +19 -0
- hare/fields/validators/limits/numeric_validator.py +19 -0
- hare/fields/validators/validator.py +34 -0
- hare/gis/__init__.py +52 -0
- hare/gis/aggregates/__init__.py +5 -0
- hare/gis/aggregates/declarations.py +42 -0
- hare/gis/aggregates/spatial_aggregate.py +57 -0
- hare/gis/constants.py +126 -0
- hare/gis/enums.py +74 -0
- hare/gis/fields/__init__.py +23 -0
- hare/gis/fields/declarations.py +61 -0
- hare/gis/fields/extent_field.py +60 -0
- hare/gis/fields/geometry_field.py +239 -0
- hare/gis/fields/made_line_field.py +86 -0
- hare/gis/functions/__init__.py +53 -0
- hare/gis/functions/buffer.py +29 -0
- hare/gis/functions/constants.py +17 -0
- hare/gis/functions/declarations.py +188 -0
- hare/gis/functions/simplify.py +29 -0
- hare/gis/functions/spatial_function.py +115 -0
- hare/gis/functions/transform.py +41 -0
- hare/gis/geometries/__init__.py +19 -0
- hare/gis/geometries/declarations.py +38 -0
- hare/gis/geometries/geometry.py +297 -0
- hare/gis/geometries/geometry_collection.py +62 -0
- hare/gis/geometries/line_string.py +46 -0
- hare/gis/geometries/multi_geometry.py +75 -0
- hare/gis/geometries/point.py +65 -0
- hare/gis/geometries/polygon.py +89 -0
- hare/gis/lookups/__init__.py +3 -0
- hare/gis/lookups/spatial_field_lookups.py +219 -0
- hare/gis/readers/__init__.py +11 -0
- hare/gis/readers/constants.py +15 -0
- hare/gis/readers/ewkb_reader.py +148 -0
- hare/gis/readers/geo_json_reader.py +54 -0
- hare/gis/readers/wkt_reader.py +226 -0
- hare/gis/spatial_features.py +57 -0
- hare/gis/terms/__init__.py +11 -0
- hare/gis/terms/geometry_value.py +33 -0
- hare/gis/terms/spatial_aggregate_function.py +30 -0
- hare/gis/terms/spatial_function_term.py +39 -0
- hare/gis/terms/spatial_relation_term.py +39 -0
- hare/health/__init__.py +19 -0
- hare/health/constants.py +32 -0
- hare/health/criteria/__init__.py +27 -0
- hare/health/criteria/acquire_wait_time.py +35 -0
- hare/health/criteria/all_of.py +38 -0
- hare/health/criteria/declarations.py +33 -0
- hare/health/criteria/health_criterion.py +87 -0
- hare/health/criteria/ping_failed.py +27 -0
- hare/health/criteria/ping_latency.py +29 -0
- hare/health/criteria/pool_count_criterion.py +37 -0
- hare/health/criteria/pool_saturation.py +35 -0
- hare/health/criteria/waiting_requests.py +33 -0
- hare/health/declarations.py +83 -0
- hare/health/enums.py +14 -0
- hare/health/health_check.py +240 -0
- hare/health/health_report.py +65 -0
- hare/inspectdb/__init__.py +38 -0
- hare/inspectdb/constants.py +60 -0
- hare/inspectdb/exceptions.py +72 -0
- hare/inspectdb/generation/__init__.py +1 -0
- hare/inspectdb/generation/column_type_mapper.py +113 -0
- hare/inspectdb/generation/declarations.py +34 -0
- hare/inspectdb/generation/inspected_model.py +35 -0
- hare/inspectdb/generation/inspected_model_builder.py +1174 -0
- hare/inspectdb/generation/many_to_many_tables.py +91 -0
- hare/inspectdb/generation/model_factory.py +88 -0
- hare/inspectdb/generation/model_naming.py +75 -0
- hare/inspectdb/generation/model_source_builder.py +148 -0
- hare/inspectdb/introspection/__init__.py +28 -0
- hare/inspectdb/introspection/column_info.py +67 -0
- hare/inspectdb/introspection/composite_foreign_key_info.py +27 -0
- hare/inspectdb/introspection/database_catalog.py +252 -0
- hare/inspectdb/introspection/enums.py +26 -0
- hare/inspectdb/introspection/foreign_key_info.py +25 -0
- hare/inspectdb/introspection/index_info.py +265 -0
- hare/inspectdb/introspection/inspected_field_specification.py +47 -0
- hare/inspectdb/introspection/schema_introspector.py +564 -0
- hare/inspectdb/introspection/schema_part.py +103 -0
- hare/inspectdb/introspection/table_info.py +112 -0
- hare/inspectdb/introspection/table_parts.py +101 -0
- hare/inspectdb/schema_inspector.py +224 -0
- hare/instrumentation/__init__.py +31 -0
- hare/instrumentation/capture/__init__.py +9 -0
- hare/instrumentation/capture/capture_needs.py +54 -0
- hare/instrumentation/capture/captured_change.py +38 -0
- hare/instrumentation/capture/captured_write.py +223 -0
- hare/instrumentation/capture/change_capturing.py +496 -0
- hare/instrumentation/capture/change_sink.py +57 -0
- hare/instrumentation/change_events.py +246 -0
- hare/instrumentation/constants.py +41 -0
- hare/instrumentation/declarations.py +196 -0
- hare/instrumentation/enums.py +35 -0
- hare/instrumentation/observers/__init__.py +1 -0
- hare/instrumentation/observers/observer.py +56 -0
- hare/instrumentation/observers/observer_dispatch.py +197 -0
- hare/instrumentation/observers/observer_set.py +138 -0
- hare/instrumentation/observers/observers.py +368 -0
- hare/instrumentation/pools/__init__.py +1 -0
- hare/instrumentation/pools/duration_records.py +50 -0
- hare/instrumentation/pools/pool_metrics.py +50 -0
- hare/instrumentation/pools/pool_registry.py +49 -0
- hare/instrumentation/queries/__init__.py +1 -0
- hare/instrumentation/queries/query_tags.py +133 -0
- hare/instrumentation/queries/query_wrapper.py +37 -0
- hare/lazy_loading/__init__.py +1 -0
- hare/lazy_loading/lazy_pattern.py +45 -0
- hare/lazy_loading/pydantic_classes.py +96 -0
- hare/migrations/__init__.py +90 -0
- hare/migrations/api/__init__.py +24 -0
- hare/migrations/api/checkmigrations.py +55 -0
- hare/migrations/api/makemigrations.py +78 -0
- hare/migrations/api/migrate.py +47 -0
- hare/migrations/api/migration_request_parser.py +86 -0
- hare/migrations/api/plan.py +39 -0
- hare/migrations/api/sqlmigrate.py +51 -0
- hare/migrations/api/squashmigrations.py +51 -0
- hare/migrations/autodetection/__init__.py +4 -0
- hare/migrations/autodetection/constants.py +49 -0
- hare/migrations/autodetection/diffs/__init__.py +1 -0
- hare/migrations/autodetection/diffs/constraint_diff.py +48 -0
- hare/migrations/autodetection/diffs/declarations.py +73 -0
- hare/migrations/autodetection/diffs/declared_schema_object_diff.py +47 -0
- hare/migrations/autodetection/diffs/grant_diff.py +24 -0
- hare/migrations/autodetection/diffs/index_diff.py +73 -0
- hare/migrations/autodetection/diffs/materialized_view_diff.py +44 -0
- hare/migrations/autodetection/diffs/partition_diff.py +99 -0
- hare/migrations/autodetection/diffs/schema_object_diff.py +153 -0
- hare/migrations/autodetection/diffs/state_field_diff.py +566 -0
- hare/migrations/autodetection/diffs/state_model_diff.py +355 -0
- hare/migrations/autodetection/diffs/trigger_diff.py +31 -0
- hare/migrations/autodetection/diffs/view_diff.py +24 -0
- hare/migrations/autodetection/field_comparable_values.py +20 -0
- hare/migrations/autodetection/migration_autodetector.py +337 -0
- hare/migrations/autodetection/migration_splitter.py +151 -0
- hare/migrations/autodetection/operation_generator.py +1115 -0
- hare/migrations/autodetection/operation_sorter.py +213 -0
- hare/migrations/autodetection/rename_questions.py +98 -0
- hare/migrations/autodetection/required_extensions.py +118 -0
- hare/migrations/autodetection/schema_object_operations.py +150 -0
- hare/migrations/autodetection/split_migration.py +24 -0
- hare/migrations/autodetection/state_signatures.py +192 -0
- hare/migrations/constants.py +109 -0
- hare/migrations/drift/__init__.py +13 -0
- hare/migrations/drift/column_mismatch.py +14 -0
- hare/migrations/drift/constants.py +43 -0
- hare/migrations/drift/detect_drift.py +40 -0
- hare/migrations/drift/detect_drift_for_alias.py +87 -0
- hare/migrations/drift/drift_result.py +22 -0
- hare/migrations/drift/shadow/__init__.py +0 -0
- hare/migrations/drift/shadow/column_field_names.py +26 -0
- hare/migrations/drift/shadow/schema_comparison.py +557 -0
- hare/migrations/drift/shadow/shadow_drift.py +318 -0
- hare/migrations/drift/shadow/shadow_state.py +83 -0
- hare/migrations/exceptions.py +69 -0
- hare/migrations/execution/__init__.py +3 -0
- hare/migrations/execution/connections_plan.py +192 -0
- hare/migrations/execution/constants.py +4 -0
- hare/migrations/execution/executor/__init__.py +11 -0
- hare/migrations/execution/executor/migration_executor.py +640 -0
- hare/migrations/execution/executor/migration_target.py +9 -0
- hare/migrations/execution/executor/plan_step.py +30 -0
- hare/migrations/execution/migration_runner.py +304 -0
- hare/migrations/execution/swappable_setting_check.py +161 -0
- hare/migrations/loading/__init__.py +4 -0
- hare/migrations/loading/graph/__init__.py +13 -0
- hare/migrations/loading/graph/dummy_node.py +22 -0
- hare/migrations/loading/graph/migration_graph.py +235 -0
- hare/migrations/loading/graph/migration_key.py +14 -0
- hare/migrations/loading/graph/node.py +40 -0
- hare/migrations/loading/migration_loader.py +256 -0
- hare/migrations/loading/migrations_modules.py +207 -0
- hare/migrations/loading/recorder/__init__.py +9 -0
- hare/migrations/loading/recorder/migration_recorder.py +130 -0
- hare/migrations/loading/recorder/noop_recorder.py +26 -0
- hare/migrations/making/__init__.py +1 -0
- hare/migrations/making/declared_attribute_values.py +27 -0
- hare/migrations/making/migration_changes.py +27 -0
- hare/migrations/making/migration_checks.py +115 -0
- hare/migrations/making/migration_maker.py +291 -0
- hare/migrations/making/migration_optimizer.py +70 -0
- hare/migrations/making/migration_squasher.py +193 -0
- hare/migrations/making/squashed_migration.py +24 -0
- hare/migrations/migration.py +341 -0
- hare/migrations/operations/__init__.py +132 -0
- hare/migrations/operations/columns/__init__.py +11 -0
- hare/migrations/operations/columns/alter_column_not_null_safe.py +140 -0
- hare/migrations/operations/columns/backfill_column.py +118 -0
- hare/migrations/operations/constants.py +20 -0
- hare/migrations/operations/constraints/__init__.py +15 -0
- hare/migrations/operations/constraints/add_constraint.py +129 -0
- hare/migrations/operations/constraints/declarations.py +13 -0
- hare/migrations/operations/constraints/rename_constraint.py +21 -0
- hare/migrations/operations/constraints/validate_constraint.py +66 -0
- hare/migrations/operations/database_functions/__init__.py +10 -0
- hare/migrations/operations/database_functions/add_function.py +28 -0
- hare/migrations/operations/database_functions/alter_function.py +30 -0
- hare/migrations/operations/database_functions/remove_function.py +20 -0
- hare/migrations/operations/database_functions/rename_function.py +21 -0
- hare/migrations/operations/declared_uniqueness_checks.py +76 -0
- hare/migrations/operations/dependencies/__init__.py +1 -0
- hare/migrations/operations/dependencies/operation_dependency.py +89 -0
- hare/migrations/operations/dependencies/relation_dependencies.py +157 -0
- hare/migrations/operations/dictionaries/__init__.py +10 -0
- hare/migrations/operations/dictionaries/add_dictionary.py +28 -0
- hare/migrations/operations/dictionaries/alter_dictionary.py +29 -0
- hare/migrations/operations/dictionaries/remove_dictionary.py +20 -0
- hare/migrations/operations/dictionaries/rename_dictionary.py +21 -0
- hare/migrations/operations/enum_types/__init__.py +7 -0
- hare/migrations/operations/enum_types/alter_enum_type.py +64 -0
- hare/migrations/operations/enum_types/create_enum_type.py +57 -0
- hare/migrations/operations/enum_types/drop_enum_type.py +66 -0
- hare/migrations/operations/enum_types/enum_type_operation.py +35 -0
- hare/migrations/operations/enums.py +24 -0
- hare/migrations/operations/extensions/__init__.py +15 -0
- hare/migrations/operations/extensions/create_collation.py +82 -0
- hare/migrations/operations/extensions/create_extension.py +47 -0
- hare/migrations/operations/extensions/remove_collation.py +35 -0
- hare/migrations/operations/extensions/remove_extension.py +40 -0
- hare/migrations/operations/fields/__init__.py +11 -0
- hare/migrations/operations/fields/add_field.py +135 -0
- hare/migrations/operations/fields/alter_field.py +128 -0
- hare/migrations/operations/fields/field_add_remove_operation.py +41 -0
- hare/migrations/operations/fields/field_like.py +14 -0
- hare/migrations/operations/fields/remove_field.py +326 -0
- hare/migrations/operations/fields/rename_field.py +725 -0
- hare/migrations/operations/grants/__init__.py +8 -0
- hare/migrations/operations/grants/add_grant.py +31 -0
- hare/migrations/operations/grants/remove_grant.py +35 -0
- hare/migrations/operations/hare_operation.py +174 -0
- hare/migrations/operations/indexes/__init__.py +13 -0
- hare/migrations/operations/indexes/add_index.py +42 -0
- hare/migrations/operations/indexes/declarations.py +12 -0
- hare/migrations/operations/indexes/remove_index.py +36 -0
- hare/migrations/operations/materialized_views/__init__.py +17 -0
- hare/migrations/operations/materialized_views/add_materialized_view.py +37 -0
- hare/migrations/operations/materialized_views/alter_materialized_view.py +32 -0
- hare/migrations/operations/materialized_views/refresh_materialized_view.py +57 -0
- hare/migrations/operations/materialized_views/remove_materialized_view.py +28 -0
- hare/migrations/operations/materialized_views/rename_materialized_view.py +23 -0
- hare/migrations/operations/model_bound_operation.py +95 -0
- hare/migrations/operations/models/__init__.py +12 -0
- hare/migrations/operations/models/alter_model_options.py +158 -0
- hare/migrations/operations/models/alter_model_schema.py +114 -0
- hare/migrations/operations/models/alter_model_table.py +65 -0
- hare/migrations/operations/models/create_model.py +407 -0
- hare/migrations/operations/models/delete_model.py +122 -0
- hare/migrations/operations/models/model_table_operation.py +45 -0
- hare/migrations/operations/models/rename_model.py +165 -0
- hare/migrations/operations/models/table_renaming_operation.py +101 -0
- hare/migrations/operations/operation.py +252 -0
- hare/migrations/operations/partitions/__init__.py +11 -0
- hare/migrations/operations/partitions/add_partition.py +36 -0
- hare/migrations/operations/partitions/partition_operation.py +93 -0
- hare/migrations/operations/partitions/remove_partition.py +36 -0
- hare/migrations/operations/policies/__init__.py +11 -0
- hare/migrations/operations/policies/add_policy.py +28 -0
- hare/migrations/operations/policies/alter_policy.py +30 -0
- hare/migrations/operations/policies/alter_row_level_security.py +90 -0
- hare/migrations/operations/policies/remove_policy.py +21 -0
- hare/migrations/operations/policies/rename_policy.py +21 -0
- hare/migrations/operations/schema_objects/__init__.py +11 -0
- hare/migrations/operations/schema_objects/add_schema_object.py +103 -0
- hare/migrations/operations/schema_objects/alter_schema_object.py +89 -0
- hare/migrations/operations/schema_objects/object_types/__init__.py +1 -0
- hare/migrations/operations/schema_objects/object_types/constraint_object_type.py +98 -0
- hare/migrations/operations/schema_objects/object_types/dictionary_object_type.py +51 -0
- hare/migrations/operations/schema_objects/object_types/function_object_type.py +55 -0
- hare/migrations/operations/schema_objects/object_types/grant_object_type.py +71 -0
- hare/migrations/operations/schema_objects/object_types/index_object_type.py +140 -0
- hare/migrations/operations/schema_objects/object_types/materialized_view_object_type.py +63 -0
- hare/migrations/operations/schema_objects/object_types/policy_object_type.py +53 -0
- hare/migrations/operations/schema_objects/object_types/schema_object_type.py +234 -0
- hare/migrations/operations/schema_objects/object_types/sequence_object_type.py +54 -0
- hare/migrations/operations/schema_objects/object_types/trigger_object_type.py +46 -0
- hare/migrations/operations/schema_objects/object_types/view_object_type.py +60 -0
- hare/migrations/operations/schema_objects/remove_schema_object.py +105 -0
- hare/migrations/operations/schema_objects/rename_schema_object.py +116 -0
- hare/migrations/operations/schemas/__init__.py +11 -0
- hare/migrations/operations/schemas/create_schema.py +45 -0
- hare/migrations/operations/schemas/drop_schema.py +40 -0
- hare/migrations/operations/sequences/__init__.py +10 -0
- hare/migrations/operations/sequences/add_sequence.py +28 -0
- hare/migrations/operations/sequences/alter_sequence.py +29 -0
- hare/migrations/operations/sequences/remove_sequence.py +20 -0
- hare/migrations/operations/sequences/rename_sequence.py +21 -0
- hare/migrations/operations/special/__init__.py +16 -0
- hare/migrations/operations/special/run_python.py +82 -0
- hare/migrations/operations/special/run_sql.py +107 -0
- hare/migrations/operations/special/separate_database_and_state.py +95 -0
- hare/migrations/operations/special/synchronize_key_series.py +51 -0
- hare/migrations/operations/triggers/__init__.py +15 -0
- hare/migrations/operations/triggers/add_trigger.py +28 -0
- hare/migrations/operations/triggers/alter_trigger.py +28 -0
- hare/migrations/operations/triggers/remove_trigger.py +20 -0
- hare/migrations/operations/triggers/rename_trigger.py +21 -0
- hare/migrations/operations/views/__init__.py +10 -0
- hare/migrations/operations/views/add_view.py +29 -0
- hare/migrations/operations/views/alter_view.py +29 -0
- hare/migrations/operations/views/remove_view.py +20 -0
- hare/migrations/operations/views/rename_view.py +21 -0
- hare/migrations/reports/__init__.py +12 -0
- hare/migrations/reports/operation_effect.py +28 -0
- hare/migrations/reports/operation_plan.py +23 -0
- hare/migrations/runtime_enums.py +88 -0
- hare/migrations/safety/__init__.py +16 -0
- hare/migrations/safety/enums.py +37 -0
- hare/migrations/safety/migration_risk.py +33 -0
- hare/migrations/safety/migration_safety_checker.py +250 -0
- hare/migrations/safety/migration_safety_context.py +142 -0
- hare/migrations/state/__init__.py +11 -0
- hare/migrations/state/model_state.py +359 -0
- hare/migrations/state/state.py +297 -0
- hare/migrations/state/state_apps.py +315 -0
- hare/migrations/state/state_rendering.py +222 -0
- hare/migrations/swappable_dependency.py +36 -0
- hare/migrations/writer/__init__.py +9 -0
- hare/migrations/writer/constants.py +28 -0
- hare/migrations/writer/import_manager.py +106 -0
- hare/migrations/writer/migration_writer.py +986 -0
- hare/models/__init__.py +20 -0
- hare/models/class_building/__init__.py +1 -0
- hare/models/class_building/abstract_meta_inheritance.py +116 -0
- hare/models/class_building/blind_indexes.py +54 -0
- hare/models/class_building/constants.py +61 -0
- hare/models/class_building/extension_model_options.py +20 -0
- hare/models/class_building/field_comments.py +131 -0
- hare/models/class_building/generic_foreign_keys.py +287 -0
- hare/models/class_building/instance_constructors.py +110 -0
- hare/models/class_building/lazy_relation_fields.py +140 -0
- hare/models/class_building/model_definition_checks.py +710 -0
- hare/models/class_building/model_field_collection.py +185 -0
- hare/models/class_building/model_managers.py +62 -0
- hare/models/class_building/primary_key_declaration.py +204 -0
- hare/models/class_building/schema_object_declarations.py +106 -0
- hare/models/constants.py +75 -0
- hare/models/deletion/__init__.py +0 -0
- hare/models/deletion/cascade/__init__.py +1 -0
- hare/models/deletion/cascade/cascade_deletion.py +818 -0
- hare/models/deletion/cascade/cascade_restore.py +150 -0
- hare/models/deletion/cascade/deletion_collector.py +646 -0
- hare/models/deletion/cascade/deletion_graph.py +418 -0
- hare/models/deletion/cascade/deletion_plan.py +94 -0
- hare/models/deletion/cascade/protect_constraint_deferral.py +91 -0
- hare/models/deletion/cascade/related_rows.py +417 -0
- hare/models/deletion/cascade/tenant_schema_visits.py +96 -0
- hare/models/deletion/constants.py +29 -0
- hare/models/deletion/instance_deletion.py +288 -0
- hare/models/deletion/preview/__init__.py +1 -0
- hare/models/deletion/preview/delete_preview.py +93 -0
- hare/models/deletion/preview/delete_preview_builder.py +431 -0
- hare/models/deletion/soft_deletion.py +207 -0
- hare/models/enums.py +76 -0
- hare/models/instances/__init__.py +1 -0
- hare/models/instances/dirty_fields.py +99 -0
- hare/models/instances/field_snapshot.py +116 -0
- hare/models/instances/instance_connections.py +61 -0
- hare/models/instances/instance_copies.py +46 -0
- hare/models/instances/instance_initialization.py +323 -0
- hare/models/instances/instance_refresh.py +158 -0
- hare/models/instances/instance_saving.py +512 -0
- hare/models/meta_info.py +1143 -0
- hare/models/model.py +935 -0
- hare/models/model_meta.py +255 -0
- hare/models/tenancy/__init__.py +1 -0
- hare/models/tenancy/constants.py +16 -0
- hare/models/tenancy/tenancy.py +363 -0
- hare/models/tenancy/tenant_row_level_security.py +76 -0
- hare/models/tenancy/tenant_schemas.py +232 -0
- hare/models/uniqueness/__init__.py +0 -0
- hare/models/uniqueness/declared_uniqueness.py +99 -0
- hare/models/write/__init__.py +3 -0
- hare/models/write/generated_keys.py +97 -0
- hare/models/write/insert/__init__.py +1 -0
- hare/models/write/insert/insert_conflict.py +88 -0
- hare/models/write/insert/insert_statement.py +155 -0
- hare/models/write/instance_capture.py +173 -0
- hare/models/write/instance_values.py +126 -0
- hare/models/write/instance_writer.py +949 -0
- hare/models/write/returned_values.py +98 -0
- hare/models/write/rollback_restores.py +213 -0
- hare/models/write/rules/__init__.py +2 -0
- hare/models/write/rules/constants.py +65 -0
- hare/models/write/rules/enums.py +18 -0
- hare/models/write/rules/relation_key_values.py +50 -0
- hare/models/write/rules/row_write_rules.py +635 -0
- hare/models/write/rules/tenant_write_rules.py +300 -0
- hare/models/write/rules/written_instances.py +37 -0
- hare/models/write/rules/written_target_checks.py +63 -0
- hare/models/write/update/__init__.py +1 -0
- hare/models/write/update/expression_assignment.py +162 -0
- hare/models/write/update/update_parameter_slot.py +43 -0
- hare/models/write/write_steps.py +98 -0
- hare/native/__init__.py +1 -0
- hare/native/native_modules.py +19 -0
- hare/numbers/__init__.py +1 -0
- hare/numbers/finite_numbers.py +27 -0
- hare/py.typed +0 -0
- hare/query/__init__.py +0 -0
- hare/query/constants.py +41 -0
- hare/query/enums.py +129 -0
- hare/query/expressions/__init__.py +63 -0
- hare/query/expressions/aggregate.py +442 -0
- hare/query/expressions/aggregate_paths/__init__.py +9 -0
- hare/query/expressions/aggregate_paths/aggregate_crossing.py +20 -0
- hare/query/expressions/aggregate_paths/aggregated_multi_valued_paths.py +581 -0
- hare/query/expressions/aggregate_paths/constants.py +10 -0
- hare/query/expressions/arithmetic/__init__.py +1 -0
- hare/query/expressions/arithmetic/arithmetic_operators.py +57 -0
- hare/query/expressions/arithmetic/combinable_expression.py +47 -0
- hare/query/expressions/arithmetic/combined_expression.py +614 -0
- hare/query/expressions/arithmetic/constants.py +37 -0
- hare/query/expressions/case/__init__.py +1 -0
- hare/query/expressions/case/case.py +230 -0
- hare/query/expressions/case/case_branch_value.py +14 -0
- hare/query/expressions/case/when.py +167 -0
- hare/query/expressions/compatibility/__init__.py +9 -0
- hare/query/expressions/compatibility/constants.py +107 -0
- hare/query/expressions/compatibility/output_field_compatibility.py +248 -0
- hare/query/expressions/compatibility/result_branch.py +46 -0
- hare/query/expressions/conditions/__init__.py +1 -0
- hare/query/expressions/conditions/q.py +525 -0
- hare/query/expressions/conditions/query_modifier.py +90 -0
- hare/query/expressions/constants.py +120 -0
- hare/query/expressions/declarations.py +12 -0
- hare/query/expressions/enums.py +39 -0
- hare/query/expressions/expression.py +129 -0
- hare/query/expressions/expression_context.py +63 -0
- hare/query/expressions/expression_result.py +41 -0
- hare/query/expressions/f.py +212 -0
- hare/query/expressions/frames/__init__.py +12 -0
- hare/query/expressions/frames/constants.py +14 -0
- hare/query/expressions/frames/declarations.py +22 -0
- hare/query/expressions/frames/window_frame.py +126 -0
- hare/query/expressions/function.py +490 -0
- hare/query/expressions/joins/__init__.py +1 -0
- hare/query/expressions/joins/array_join.py +147 -0
- hare/query/expressions/joins/array_join_element.py +27 -0
- hare/query/expressions/joins/asof_join.py +263 -0
- hare/query/expressions/joins/filtered_relation.py +338 -0
- hare/query/expressions/joins/json_table.py +147 -0
- hare/query/expressions/joins/json_table_column.py +21 -0
- hare/query/expressions/joins/lateral.py +88 -0
- hare/query/expressions/joins/merge_source_row.py +44 -0
- hare/query/expressions/joins/named_columns.py +43 -0
- hare/query/expressions/joins/named_join.py +204 -0
- hare/query/expressions/numeric/__init__.py +11 -0
- hare/query/expressions/numeric/numeric_type.py +18 -0
- hare/query/expressions/numeric/numeric_typing.py +216 -0
- hare/query/expressions/numeric/unrounded_decimal_field.py +16 -0
- hare/query/expressions/ordering.py +55 -0
- hare/query/expressions/raw_sql.py +168 -0
- hare/query/expressions/subqueries/__init__.py +1 -0
- hare/query/expressions/subqueries/cte_rows.py +46 -0
- hare/query/expressions/subqueries/declarations.py +8 -0
- hare/query/expressions/subqueries/exists.py +181 -0
- hare/query/expressions/subqueries/outer_reference.py +157 -0
- hare/query/expressions/subqueries/outer_scope.py +74 -0
- hare/query/expressions/subqueries/recursive_rows.py +177 -0
- hare/query/expressions/subqueries/subquery.py +236 -0
- hare/query/expressions/temporal/__init__.py +9 -0
- hare/query/expressions/temporal/constants.py +43 -0
- hare/query/expressions/temporal/temporal_arithmetic.py +254 -0
- hare/query/expressions/temporal/temporal_operand.py +25 -0
- hare/query/expressions/term_expression.py +28 -0
- hare/query/expressions/value.py +259 -0
- hare/query/expressions/value_references/__init__.py +49 -0
- hare/query/expressions/value_references/array_value_reference.py +41 -0
- hare/query/expressions/value_references/composite_key_value_reference.py +61 -0
- hare/query/expressions/value_references/cursor_value_reference.py +41 -0
- hare/query/expressions/value_references/encoded_value_reference.py +43 -0
- hare/query/expressions/value_references/expression_arguments.py +181 -0
- hare/query/expressions/value_references/like_value_reference.py +46 -0
- hare/query/expressions/value_references/list_parameter_value_reference.py +65 -0
- hare/query/expressions/value_references/list_value_reference.py +55 -0
- hare/query/expressions/value_references/literal_value_reference.py +38 -0
- hare/query/expressions/value_references/open_range_value_reference.py +53 -0
- hare/query/expressions/value_references/range_value_reference.py +49 -0
- hare/query/expressions/value_references/rebuilt_criterion_value_reference.py +93 -0
- hare/query/expressions/value_references/related_key_value_reference.py +67 -0
- hare/query/expressions/value_references/related_value_reference.py +33 -0
- hare/query/expressions/value_references/row_list_value_reference.py +67 -0
- hare/query/expressions/value_references/scalar_value_reference.py +41 -0
- hare/query/expressions/value_references/value_reference_types.py +65 -0
- hare/query/expressions/value_references/write_value_reference.py +41 -0
- hare/query/expressions/window.py +220 -0
- hare/query/filters/__init__.py +21 -0
- hare/query/filters/constants.py +89 -0
- hare/query/filters/lookups/__init__.py +1 -0
- hare/query/filters/lookups/annotation_container_lookups.py +40 -0
- hare/query/filters/lookups/constants.py +60 -0
- hare/query/filters/lookups/containers/__init__.py +3 -0
- hare/query/filters/lookups/containers/container_field_lookups.py +78 -0
- hare/query/filters/lookups/containers/container_lookups.py +80 -0
- hare/query/filters/lookups/containers/container_value_encoders.py +94 -0
- hare/query/filters/lookups/date_part_lookups.py +292 -0
- hare/query/filters/lookups/dialect_implemented_operators.py +39 -0
- hare/query/filters/lookups/field_lookup.py +59 -0
- hare/query/filters/lookups/field_lookups.py +289 -0
- hare/query/filters/lookups/field_transforms.py +98 -0
- hare/query/filters/lookups/json/__init__.py +1 -0
- hare/query/filters/lookups/json/json_filter_guards.py +412 -0
- hare/query/filters/lookups/json/json_filter_parser.py +82 -0
- hare/query/filters/lookups/json/json_lookups.py +67 -0
- hare/query/filters/lookups/json/json_path_lookups.py +184 -0
- hare/query/filters/lookups/lookups.py +371 -0
- hare/query/filters/lookups/value_encoders.py +246 -0
- hare/query/filters/resolution/__init__.py +1 -0
- hare/query/filters/resolution/annotation_filters.py +280 -0
- hare/query/filters/resolution/composite_key_filters.py +439 -0
- hare/query/filters/resolution/filter_kwargs.py +704 -0
- hare/query/filters/resolution/filter_values.py +565 -0
- hare/query/filters/resolution/json_path_filters.py +157 -0
- hare/query/filters/resolution/lookup_support.py +84 -0
- hare/query/filters/resolution/relation_filters.py +510 -0
- hare/query/filters/resolution/sensitive_filter_keys.py +91 -0
- hare/query/filters/resolution/to_many_filters.py +436 -0
- hare/query/functions/__init__.py +185 -0
- hare/query/functions/aggregates/__init__.py +9 -0
- hare/query/functions/aggregates/array_agg.py +48 -0
- hare/query/functions/aggregates/avg.py +59 -0
- hare/query/functions/aggregates/constants.py +5 -0
- hare/query/functions/aggregates/count.py +81 -0
- hare/query/functions/aggregates/declarations.py +51 -0
- hare/query/functions/aggregates/statistic_aggregate.py +67 -0
- hare/query/functions/aggregates/sum.py +55 -0
- hare/query/functions/comparison/__init__.py +9 -0
- hare/query/functions/comparison/cast.py +121 -0
- hare/query/functions/comparison/coalesce.py +140 -0
- hare/query/functions/comparison/collate.py +45 -0
- hare/query/functions/comparison/declarations.py +21 -0
- hare/query/functions/comparison/function_arguments.py +70 -0
- hare/query/functions/comparison/greatest_least_function.py +108 -0
- hare/query/functions/comparison/null_if.py +78 -0
- hare/query/functions/containers/__init__.py +7 -0
- hare/query/functions/containers/array_item.py +69 -0
- hare/query/functions/datetime/__init__.py +55 -0
- hare/query/functions/datetime/date_function_source.py +31 -0
- hare/query/functions/datetime/declarations.py +193 -0
- hare/query/functions/datetime/extract.py +97 -0
- hare/query/functions/datetime/now.py +26 -0
- hare/query/functions/datetime/trunc.py +124 -0
- hare/query/functions/json/__init__.py +6 -0
- hare/query/functions/json/json_array.py +34 -0
- hare/query/functions/json/json_object.py +161 -0
- hare/query/functions/math/__init__.py +53 -0
- hare/query/functions/math/declarations.py +192 -0
- hare/query/functions/math/enums.py +16 -0
- hare/query/functions/math/math_function.py +110 -0
- hare/query/functions/math/mod.py +52 -0
- hare/query/functions/math/pi.py +21 -0
- hare/query/functions/math/random.py +22 -0
- hare/query/functions/math/round.py +85 -0
- hare/query/functions/text/__init__.py +55 -0
- hare/query/functions/text/concat.py +99 -0
- hare/query/functions/text/declarations.py +197 -0
- hare/query/functions/text/l_pad.py +17 -0
- hare/query/functions/text/length.py +38 -0
- hare/query/functions/text/r_pad.py +17 -0
- hare/query/functions/text/replace.py +17 -0
- hare/query/functions/text/text_function.py +114 -0
- hare/query/functions/window/__init__.py +45 -0
- hare/query/functions/window/aggregate_window_function.py +43 -0
- hare/query/functions/window/avg.py +23 -0
- hare/query/functions/window/constants.py +3 -0
- hare/query/functions/window/count.py +54 -0
- hare/query/functions/window/declarations.py +153 -0
- hare/query/functions/window/distribution_window_function.py +21 -0
- hare/query/functions/window/field_window_function.py +149 -0
- hare/query/functions/window/n_tile.py +41 -0
- hare/query/functions/window/nth_value.py +54 -0
- hare/query/functions/window/offset_window_function.py +85 -0
- hare/query/functions/window/rank_like_window_function.py +21 -0
- hare/query/functions/window/statistic_window_function.py +44 -0
- hare/query/functions/window/sum.py +23 -0
- hare/query/functions/window/window_function.py +134 -0
- hare/query/generic_foreign_keys/__init__.py +3 -0
- hare/query/generic_foreign_keys/constants.py +21 -0
- hare/query/generic_foreign_keys/generic_foreign_key_filters.py +251 -0
- hare/query/generic_foreign_keys/generic_foreign_key_paths.py +183 -0
- hare/query/generic_foreign_keys/generic_foreign_key_types.py +94 -0
- hare/query/grouping/__init__.py +14 -0
- hare/query/grouping/declarations.py +21 -0
- hare/query/grouping/grouping.py +60 -0
- hare/query/grouping/grouping_set.py +67 -0
- hare/query/grouping/grouping_sets.py +55 -0
- hare/query/key_columns.py +297 -0
- hare/query/lookup_info/__init__.py +12 -0
- hare/query/lookup_info/declarations.py +27 -0
- hare/query/lookup_info/lookup_info.py +89 -0
- hare/query/lookup_info/lookup_info_builder.py +807 -0
- hare/query/lookup_info/lookup_path.py +94 -0
- hare/query/lookup_info/lookup_paths.py +415 -0
- hare/query/lookup_info/ordering_info.py +43 -0
- hare/query/lookup_info/value_paths.py +135 -0
- hare/query/managers/__init__.py +1 -0
- hare/query/managers/base_manager.py +20 -0
- hare/query/managers/manager.py +130 -0
- hare/query/plans/__init__.py +4 -0
- hare/query/plans/call_signatures/__init__.py +1 -0
- hare/query/plans/call_signatures/call_signature_plans.py +318 -0
- hare/query/plans/call_signatures/call_signature_runs.py +466 -0
- hare/query/plans/constants.py +37 -0
- hare/query/plans/description/__init__.py +11 -0
- hare/query/plans/description/declared_plan_parts.py +7 -0
- hare/query/plans/description/filter_plan_descriptions.py +229 -0
- hare/query/plans/description/hashable_values.py +22 -0
- hare/query/plans/description/plan_context.py +33 -0
- hare/query/plans/description/plan_describer_compiler.py +355 -0
- hare/query/plans/description/plan_description.py +66 -0
- hare/query/plans/description/plan_parts.py +150 -0
- hare/query/plans/description/plannable.py +69 -0
- hare/query/plans/description/term_plan_descriptions.py +92 -0
- hare/query/plans/enums.py +97 -0
- hare/query/plans/plan_origins.py +99 -0
- hare/query/plans/recording/__init__.py +1 -0
- hare/query/plans/recording/plan_recording.py +100 -0
- hare/query/plans/recording/scope_value_source.py +67 -0
- hare/query/plans/statement/__init__.py +1 -0
- hare/query/plans/statement/declared_plan_slots.py +11 -0
- hare/query/plans/statement/query_key_compiler.py +171 -0
- hare/query/plans/statement/raw_sql_plan.py +47 -0
- hare/query/plans/statement/statement_plan.py +522 -0
- hare/query/plans/statement/statement_plan_descriptions.py +451 -0
- hare/query/plans/statement/statement_plan_runs.py +306 -0
- hare/query/plans/statement/statement_plans.py +128 -0
- hare/query/query_connection.py +110 -0
- hare/query/queryset/__init__.py +19 -0
- hare/query/queryset/annotation_access_tracker.py +20 -0
- hare/query/queryset/arguments/__init__.py +1 -0
- hare/query/queryset/arguments/annotation_arguments.py +215 -0
- hare/query/queryset/arguments/collection_arguments.py +29 -0
- hare/query/queryset/arguments/filter_arguments.py +260 -0
- hare/query/queryset/arguments/ordering_arguments.py +242 -0
- hare/query/queryset/arguments/values_arguments.py +145 -0
- hare/query/queryset/combination/__init__.py +1 -0
- hare/query/queryset/combination/combination.py +58 -0
- hare/query/queryset/combination/queryset_combination.py +109 -0
- hare/query/queryset/concrete_field_paths.py +109 -0
- hare/query/queryset/constants.py +83 -0
- hare/query/queryset/date_lists.py +74 -0
- hare/query/queryset/declarations.py +7 -0
- hare/query/queryset/extensions/__init__.py +9 -0
- hare/query/queryset/extensions/query_set_extension.py +78 -0
- hare/query/queryset/extensions/query_set_extension_call.py +19 -0
- hare/query/queryset/extensions/query_set_extension_query.py +146 -0
- hare/query/queryset/extensions/query_set_extensions.py +247 -0
- hare/query/queryset/lazy_relation_names.py +33 -0
- hare/query/queryset/model_query.py +79 -0
- hare/query/queryset/objects_by_key.py +79 -0
- hare/query/queryset/options/__init__.py +1 -0
- hare/query/queryset/options/query_option.py +42 -0
- hare/query/queryset/options/query_options.py +313 -0
- hare/query/queryset/pending_calls/__init__.py +1 -0
- hare/query/queryset/pending_calls/calls_before_setup.py +185 -0
- hare/query/queryset/pending_calls/pending_filter_calls.py +144 -0
- hare/query/queryset/query_specification.py +1088 -0
- hare/query/queryset/queryset.py +2527 -0
- hare/query/queryset/relations/__init__.py +3 -0
- hare/query/queryset/relations/linked_many_to_many_relation.py +41 -0
- hare/query/queryset/relations/many_to_many/__init__.py +1 -0
- hare/query/queryset/relations/many_to_many/linked_keys.py +147 -0
- hare/query/queryset/relations/many_to_many/linked_rows_queries.py +175 -0
- hare/query/queryset/relations/many_to_many/many_to_many_members.py +173 -0
- hare/query/queryset/relations/many_to_many/many_to_many_scope_checks.py +332 -0
- hare/query/queryset/relations/many_to_many/through_defaults.py +244 -0
- hare/query/queryset/relations/many_to_many/through_row_inserting.py +516 -0
- hare/query/queryset/relations/many_to_many/through_row_unlinking.py +333 -0
- hare/query/queryset/relations/many_to_many/through_rows.py +185 -0
- hare/query/queryset/relations/many_to_many_relation.py +382 -0
- hare/query/queryset/relations/related_queryset/__init__.py +9 -0
- hare/query/queryset/relations/related_queryset/related_query_set.py +366 -0
- hare/query/queryset/relations/related_queryset/related_rows_iterator.py +42 -0
- hare/query/queryset/relations/related_queryset/relation_rows.py +73 -0
- hare/query/queryset/relations/related_queryset/unsaved_owner_condition.py +37 -0
- hare/query/queryset/relations/reverse_relation.py +474 -0
- hare/query/queryset/row_multiplication.py +151 -0
- hare/query/queryset/schema_object_calls.py +45 -0
- hare/query/queryset/selection/__init__.py +1 -0
- hare/query/queryset/selection/statement_selection.py +217 -0
- hare/query/queryset/selection/values_selection.py +65 -0
- hare/query/queryset/single_rows/__init__.py +1 -0
- hare/query/queryset/single_rows/get_exception_argument.py +7 -0
- hare/query/queryset/single_rows/get_exceptions.py +91 -0
- hare/query/queryset/single_rows/none_awaitable_type.py +21 -0
- hare/query/queryset/single_rows/query_set_single.py +49 -0
- hare/query/queryset/single_rows/single_row.py +103 -0
- hare/query/queryset/specification_copying.py +123 -0
- hare/query/queryset/table_sample.py +60 -0
- hare/query/raw_sql/__init__.py +6 -0
- hare/query/raw_sql/execute_sql.py +71 -0
- hare/query/raw_sql/sql_query_result.py +38 -0
- hare/query/relation_loading/__init__.py +14 -0
- hare/query/relation_loading/constants.py +8 -0
- hare/query/relation_loading/prefetching/__init__.py +1 -0
- hare/query/relation_loading/prefetching/declarations.py +32 -0
- hare/query/relation_loading/prefetching/direct_relation_prefetch.py +234 -0
- hare/query/relation_loading/prefetching/many_to_many_prefetch.py +496 -0
- hare/query/relation_loading/prefetching/prefetch.py +198 -0
- hare/query/relation_loading/prefetching/prefetch_checks.py +80 -0
- hare/query/relation_loading/prefetching/prefetch_related_objects.py +48 -0
- hare/query/relation_loading/prefetching/prefetch_request.py +30 -0
- hare/query/relation_loading/prefetching/prefetcher.py +200 -0
- hare/query/relation_loading/prefetching/related_rows_fetch.py +116 -0
- hare/query/relation_loading/prefetching/reverse_relation_prefetch.py +201 -0
- hare/query/relation_loading/prefetching/sliced_prefetch.py +165 -0
- hare/query/relation_loading/select.py +26 -0
- hare/query/rows/__init__.py +3 -0
- hare/query/rows/constants.py +33 -0
- hare/query/rows/enums.py +81 -0
- hare/query/rows/model_rows/__init__.py +1 -0
- hare/query/rows/model_rows/combined_model_rows.py +254 -0
- hare/query/rows/model_rows/model_columns.py +210 -0
- hare/query/rows/model_rows/model_rows.py +462 -0
- hare/query/rows/native/__init__.py +1 -0
- hare/query/rows/native/enums.py +12 -0
- hare/query/rows/native/field_codecs.py +450 -0
- hare/query/rows/native/hydrate_accelerator.py +264 -0
- hare/query/rows/native/hydration_layout.py +114 -0
- hare/query/rows/values_rows/__init__.py +1 -0
- hare/query/rows/values_rows/combined_values_rows.py +133 -0
- hare/query/rows/values_rows/dict_rows.py +92 -0
- hare/query/rows/values_rows/flat_rows.py +33 -0
- hare/query/rows/values_rows/named_rows.py +52 -0
- hare/query/rows/values_rows/tuple_rows.py +128 -0
- hare/query/rows/values_rows/value_field.py +26 -0
- hare/query/rows/values_rows/values_rows.py +175 -0
- hare/query/scopes/__init__.py +21 -0
- hare/query/scopes/constants.py +14 -0
- hare/query/scopes/manager_scope.py +51 -0
- hare/query/scopes/row_scope.py +46 -0
- hare/query/scopes/row_scopes.py +281 -0
- hare/query/scopes/row_visibility.py +89 -0
- hare/query/scopes/scope_join_conditions.py +273 -0
- hare/query/scopes/soft_delete_scope.py +17 -0
- hare/query/scopes/tenants/__init__.py +1 -0
- hare/query/scopes/tenants/all_tenants.py +11 -0
- hare/query/scopes/tenants/model_tenants.py +79 -0
- hare/query/scopes/tenants/tenant_scope.py +70 -0
- hare/query/scopes/tenants/tenant_values.py +52 -0
- hare/query/statements/__init__.py +30 -0
- hare/query/statements/awaitable_query.py +709 -0
- hare/query/statements/building/__init__.py +1 -0
- hare/query/statements/building/keyset_bounds.py +179 -0
- hare/query/statements/building/query_annotations.py +350 -0
- hare/query/statements/building/query_conditions.py +244 -0
- hare/query/statements/building/query_ctes.py +70 -0
- hare/query/statements/building/query_grouping.py +347 -0
- hare/query/statements/building/query_joins.py +282 -0
- hare/query/statements/building/query_ordering.py +275 -0
- hare/query/statements/building/row_locks.py +216 -0
- hare/query/statements/constants.py +111 -0
- hare/query/statements/select/__init__.py +4 -0
- hare/query/statements/select/combined/__init__.py +1 -0
- hare/query/statements/select/combined/combined_branches.py +380 -0
- hare/query/statements/select/combined/combined_derived_queries.py +220 -0
- hare/query/statements/select/combined/combined_plan_descriptions.py +43 -0
- hare/query/statements/select/combined_query.py +354 -0
- hare/query/statements/select/model_rows/__init__.py +1 -0
- hare/query/statements/select/model_rows/instance_hydration.py +162 -0
- hare/query/statements/select/model_rows/model_rows_plan_descriptions.py +108 -0
- hare/query/statements/select/model_rows/only_defer_fields.py +243 -0
- hare/query/statements/select/model_rows/select_related_joins.py +112 -0
- hare/query/statements/select/model_rows_query.py +416 -0
- hare/query/statements/select/raw_sql_query.py +151 -0
- hare/query/statements/select/rows_query.py +210 -0
- hare/query/statements/select/select_query.py +110 -0
- hare/query/statements/select/values/__init__.py +1 -0
- hare/query/statements/select/values/constants.py +9 -0
- hare/query/statements/select/values/values_distinct.py +41 -0
- hare/query/statements/select/values/values_grouping.py +118 -0
- hare/query/statements/select/values/values_output.py +298 -0
- hare/query/statements/select/values/values_reading.py +26 -0
- hare/query/statements/select/values/window_filter_wrapping.py +91 -0
- hare/query/statements/select/values_query.py +754 -0
- hare/query/statements/summary/__init__.py +3 -0
- hare/query/statements/summary/aggregate_query.py +732 -0
- hare/query/statements/summary/contains_query.py +66 -0
- hare/query/statements/summary/count_query.py +117 -0
- hare/query/statements/summary/exists_query.py +151 -0
- hare/query/statements/summary/rows_summary_query.py +187 -0
- hare/query/statements/write/__init__.py +3 -0
- hare/query/statements/write/bulk/__init__.py +1 -0
- hare/query/statements/write/bulk/bulk_objects.py +61 -0
- hare/query/statements/write/bulk/bulk_update_checks.py +92 -0
- hare/query/statements/write/bulk/bulk_update_query.py +1012 -0
- hare/query/statements/write/bulk/bulk_write_batches.py +368 -0
- hare/query/statements/write/bulk/create/__init__.py +1 -0
- hare/query/statements/write/bulk/create/bulk_create_query.py +936 -0
- hare/query/statements/write/bulk/create/bulk_create_reports.py +316 -0
- hare/query/statements/write/bulk/create/conflict_clause.py +137 -0
- hare/query/statements/write/bulk/create/copy_insert.py +143 -0
- hare/query/statements/write/bulk/create/default_rows_insert.py +85 -0
- hare/query/statements/write/bulk/create/inline_insert.py +93 -0
- hare/query/statements/write/bulk/create/multi_row_insert.py +277 -0
- hare/query/statements/write/bulk/create/returned_rows_matching.py +136 -0
- hare/query/statements/write/bulk/create/template_insert.py +185 -0
- hare/query/statements/write/bulk/declarations.py +61 -0
- hare/query/statements/write/create_or_update.py +193 -0
- hare/query/statements/write/declarations.py +26 -0
- hare/query/statements/write/delete_query.py +402 -0
- hare/query/statements/write/insert_from_query.py +373 -0
- hare/query/statements/write/matching_rows_query.py +268 -0
- hare/query/statements/write/merge/__init__.py +1 -0
- hare/query/statements/write/merge/merge_query.py +818 -0
- hare/query/statements/write/merge/merge_when.py +87 -0
- hare/query/statements/write/restore_query.py +105 -0
- hare/query/statements/write/returning/__init__.py +1 -0
- hare/query/statements/write/returning/delete_returning_query.py +154 -0
- hare/query/statements/write/returning/returned_rows.py +246 -0
- hare/query/statements/write/returning/update_returning_query.py +120 -0
- hare/query/statements/write/update_query.py +851 -0
- hare/search/__init__.py +29 -0
- hare/search/constants.py +22 -0
- hare/search/enums.py +26 -0
- hare/search/query/__init__.py +8 -0
- hare/search/query/combined_search_query.py +46 -0
- hare/search/query/declarations.py +9 -0
- hare/search/query/search_query.py +75 -0
- hare/search/query/search_query_combinable.py +40 -0
- hare/search/search_arguments.py +79 -0
- hare/search/search_features.py +35 -0
- hare/search/search_headline.py +186 -0
- hare/search/search_rank.py +144 -0
- hare/search/types.py +16 -0
- hare/search/vector/__init__.py +7 -0
- hare/search/vector/combined_search_vector.py +32 -0
- hare/search/vector/search_vector.py +77 -0
- hare/search/vector/search_vector_combinable.py +30 -0
- hare/sql/__init__.py +71 -0
- hare/sql/analytics/__init__.py +17 -0
- hare/sql/analytics/count.py +13 -0
- hare/sql/analytics/current_row.py +10 -0
- hare/sql/analytics/declarations.py +15 -0
- hare/sql/analytics/row_number.py +13 -0
- hare/sql/builder/__init__.py +29 -0
- hare/sql/builder/joins/__init__.py +16 -0
- hare/sql/builder/joins/join.py +71 -0
- hare/sql/builder/joins/join_on.py +73 -0
- hare/sql/builder/joins/joiner.py +38 -0
- hare/sql/builder/queries/__init__.py +17 -0
- hare/sql/builder/queries/constants.py +5 -0
- hare/sql/builder/queries/correlated_subqueries.py +583 -0
- hare/sql/builder/queries/pagination_sql.py +19 -0
- hare/sql/builder/queries/query.py +109 -0
- hare/sql/builder/queries/query_builder.py +1090 -0
- hare/sql/builder/queries/query_sql_rendering.py +407 -0
- hare/sql/builder/queries/set_operation_query.py +203 -0
- hare/sql/builder/returned_value.py +19 -0
- hare/sql/builder/tables/__init__.py +22 -0
- hare/sql/builder/tables/aliased_query.py +33 -0
- hare/sql/builder/tables/array_join_source.py +39 -0
- hare/sql/builder/tables/asof_join_source.py +29 -0
- hare/sql/builder/tables/cte.py +18 -0
- hare/sql/builder/tables/database.py +12 -0
- hare/sql/builder/tables/json_table_query.py +76 -0
- hare/sql/builder/tables/lateral_query.py +26 -0
- hare/sql/builder/tables/schema.py +42 -0
- hare/sql/builder/tables/selectable.py +83 -0
- hare/sql/builder/tables/table.py +170 -0
- hare/sql/builder_methods.py +56 -0
- hare/sql/constants.py +87 -0
- hare/sql/enums.py +211 -0
- hare/sql/exceptions.py +31 -0
- hare/sql/functions/__init__.py +81 -0
- hare/sql/functions/address_text.py +18 -0
- hare/sql/functions/cast.py +19 -0
- hare/sql/functions/cast_to.py +38 -0
- hare/sql/functions/coalesce.py +13 -0
- hare/sql/functions/count.py +14 -0
- hare/sql/functions/datetime/__init__.py +1 -0
- hare/sql/functions/datetime/date.py +16 -0
- hare/sql/functions/datetime/date_as_timestamp.py +23 -0
- hare/sql/functions/datetime/date_trunc.py +65 -0
- hare/sql/functions/datetime/datetime_as_text.py +16 -0
- hare/sql/functions/datetime/datetime_cast.py +68 -0
- hare/sql/functions/datetime/extract.py +92 -0
- hare/sql/functions/datetime/now.py +14 -0
- hare/sql/functions/datetime/temporal_difference.py +26 -0
- hare/sql/functions/datetime/temporal_shift.py +38 -0
- hare/sql/functions/datetime/timestamp_comparand.py +18 -0
- hare/sql/functions/declarations.py +19 -0
- hare/sql/functions/distinct_option_function.py +33 -0
- hare/sql/functions/greatest_least.py +25 -0
- hare/sql/functions/grouping_function.py +13 -0
- hare/sql/functions/json/__init__.py +1 -0
- hare/sql/functions/json/json_array.py +14 -0
- hare/sql/functions/json/json_object.py +14 -0
- hare/sql/functions/json/json_sort_key.py +15 -0
- hare/sql/functions/json/json_value.py +19 -0
- hare/sql/functions/numeric_cast.py +16 -0
- hare/sql/functions/random_number.py +13 -0
- hare/sql/functions/round.py +20 -0
- hare/sql/functions/statistic.py +20 -0
- hare/sql/functions/std_dev.py +13 -0
- hare/sql/functions/text/__init__.py +1 -0
- hare/sql/functions/text/collate.py +61 -0
- hare/sql/functions/text/concat.py +18 -0
- hare/sql/functions/text/concat_function.py +53 -0
- hare/sql/functions/text/decimal_text_collate.py +16 -0
- hare/sql/functions/text/lower.py +12 -0
- hare/sql/functions/text/replace.py +12 -0
- hare/sql/functions/text/upper.py +12 -0
- hare/sql/identifiers.py +61 -0
- hare/sql/sql_context.py +155 -0
- hare/sql/terms/__init__.py +90 -0
- hare/sql/terms/arithmetic_expression.py +120 -0
- hare/sql/terms/array.py +109 -0
- hare/sql/terms/bracket.py +12 -0
- hare/sql/terms/case/__init__.py +1 -0
- hare/sql/terms/case/case.py +123 -0
- hare/sql/terms/case/when_then.py +11 -0
- hare/sql/terms/constants.py +5 -0
- hare/sql/terms/containers/__init__.py +35 -0
- hare/sql/terms/containers/array_element_term.py +58 -0
- hare/sql/terms/containers/array_slice_term.py +28 -0
- hare/sql/terms/containers/constants.py +6 -0
- hare/sql/terms/containers/container_function.py +22 -0
- hare/sql/terms/containers/container_literal.py +37 -0
- hare/sql/terms/containers/declarations.py +47 -0
- hare/sql/terms/containers/map_value_term.py +30 -0
- hare/sql/terms/containers/tuple_element_term.py +21 -0
- hare/sql/terms/criteria/__init__.py +37 -0
- hare/sql/terms/criteria/basic_criterion.py +92 -0
- hare/sql/terms/criteria/between_criterion.py +39 -0
- hare/sql/terms/criteria/complex_criterion.py +47 -0
- hare/sql/terms/criteria/contains_criterion.py +81 -0
- hare/sql/terms/criteria/criterion.py +87 -0
- hare/sql/terms/criteria/empty_criterion.py +38 -0
- hare/sql/terms/criteria/is_distinct_from_criterion.py +52 -0
- hare/sql/terms/criteria/is_not_true_criterion.py +49 -0
- hare/sql/terms/criteria/json_attribute_criterion.py +62 -0
- hare/sql/terms/criteria/like.py +56 -0
- hare/sql/terms/criteria/nested_criterion.py +78 -0
- hare/sql/terms/criteria/not_criterion.py +78 -0
- hare/sql/terms/criteria/null_criterion.py +47 -0
- hare/sql/terms/criteria/range_criterion.py +28 -0
- hare/sql/terms/criteria/true_criterion.py +13 -0
- hare/sql/terms/field.py +65 -0
- hare/sql/terms/functions/__init__.py +30 -0
- hare/sql/terms/functions/aggregate_function.py +119 -0
- hare/sql/terms/functions/analytic_function.py +107 -0
- hare/sql/terms/functions/custom_function.py +39 -0
- hare/sql/terms/functions/decimal_mod.py +27 -0
- hare/sql/terms/functions/float_mod.py +24 -0
- hare/sql/terms/functions/function.py +131 -0
- hare/sql/terms/functions/interval.py +110 -0
- hare/sql/terms/functions/mod.py +22 -0
- hare/sql/terms/functions/pow.py +11 -0
- hare/sql/terms/functions/window_frame_analytic_function.py +78 -0
- hare/sql/terms/grouping/__init__.py +14 -0
- hare/sql/terms/grouping/declarations.py +17 -0
- hare/sql/terms/grouping/grouping_element.py +42 -0
- hare/sql/terms/grouping/grouping_sets_element.py +46 -0
- hare/sql/terms/index.py +15 -0
- hare/sql/terms/infix_operator.py +34 -0
- hare/sql/terms/json.py +100 -0
- hare/sql/terms/negative.py +49 -0
- hare/sql/terms/node.py +135 -0
- hare/sql/terms/parameters/__init__.py +1 -0
- hare/sql/terms/parameters/list_parameter.py +33 -0
- hare/sql/terms/parameters/parameter.py +35 -0
- hare/sql/terms/parameters/parameterized_value_wrapper.py +19 -0
- hare/sql/terms/parameters/parameterizer.py +99 -0
- hare/sql/terms/parameters/query_parameters.py +74 -0
- hare/sql/terms/parameters/recording_parameterizer.py +27 -0
- hare/sql/terms/qualified_outer_field.py +58 -0
- hare/sql/terms/select_reference.py +80 -0
- hare/sql/terms/star.py +30 -0
- hare/sql/terms/subqueries/__init__.py +1 -0
- hare/sql/terms/subqueries/exists_term.py +111 -0
- hare/sql/terms/subqueries/outer_aggregate_term.py +51 -0
- hare/sql/terms/term.py +334 -0
- hare/sql/terms/term_identity_text.py +60 -0
- hare/sql/terms/tuple.py +52 -0
- hare/sql/terms/values/__init__.py +1 -0
- hare/sql/terms/values/literal_value.py +21 -0
- hare/sql/terms/values/null_value.py +10 -0
- hare/sql/terms/values/old_row_value.py +28 -0
- hare/sql/terms/values/row_value_list.py +15 -0
- hare/sql/terms/values/value_wrapper.py +129 -0
- hare/sql/types/__init__.py +1 -0
- hare/sql/types/sql_type.py +13 -0
- hare/sql/types/sql_types.py +17 -0
- hare/stubs/__init__.py +2 -0
- hare/stubs/constants.py +18 -0
- hare/stubs/model_stub.py +415 -0
- hare/stubs/module_stub.py +150 -0
- hare/stubs/stub_imports.py +91 -0
- hare/stubs/stub_writer.py +60 -0
- hare/stubs/value_type_text.py +98 -0
- hare/time/__init__.py +12 -0
- hare/time/constants.py +27 -0
- hare/time/system_clock.py +84 -0
- hare/time/timezone.py +534 -0
- hare/time/zone_info.py +13 -0
- hare/transactions/__init__.py +25 -0
- hare/transactions/atomic/__init__.py +1 -0
- hare/transactions/atomic/atomic.py +138 -0
- hare/transactions/atomic/atomic_attempt.py +62 -0
- hare/transactions/atomic/atomic_attempts.py +73 -0
- hare/transactions/constants.py +41 -0
- hare/transactions/distributed/__init__.py +9 -0
- hare/transactions/distributed/declarations.py +32 -0
- hare/transactions/distributed/distributed_coordinator.py +784 -0
- hare/transactions/distributed/distributed_transactions.py +26 -0
- hare/transactions/distributed/stale_prepared_transaction.py +23 -0
- hare/transactions/enums.py +31 -0
- hare/transactions/transaction_options.py +86 -0
- hare/transactions/transactions.py +228 -0
- hare/typing_info/__init__.py +3 -0
- hare/typing_info/bound_models.py +73 -0
- hare/typing_info/constants.py +13 -0
- hare/typing_info/declarations.py +44 -0
- hare/typing_info/filter_value_types.py +144 -0
- hare/vectors/__init__.py +18 -0
- hare/vectors/constants.py +10 -0
- hare/vectors/declarations.py +41 -0
- hare/vectors/enums.py +14 -0
- hare/vectors/terms/__init__.py +6 -0
- hare/vectors/terms/vector_distance_term.py +22 -0
- hare/vectors/terms/vector_literal.py +18 -0
- hare/vectors/vector_distance_expression.py +107 -0
- hare/vectors/vector_field.py +147 -0
- hare/warnings.py +13 -0
- hare_orm-0.9.0.dist-info/LICENSE +27 -0
- hare_orm-0.9.0.dist-info/METADATA +321 -0
- hare_orm-0.9.0.dist-info/NOTICE.md +96 -0
- hare_orm-0.9.0.dist-info/NOTICE.ru.md +98 -0
- hare_orm-0.9.0.dist-info/RECORD +2267 -0
- hare_orm-0.9.0.dist-info/WHEEL +4 -0
- hare_orm-0.9.0.dist-info/entry_points.txt +6 -0
|
@@ -0,0 +1,1187 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import abc
|
|
4
|
+
import asyncio
|
|
5
|
+
import contextlib
|
|
6
|
+
import contextvars
|
|
7
|
+
import datetime
|
|
8
|
+
import decimal
|
|
9
|
+
import logging
|
|
10
|
+
import time
|
|
11
|
+
from collections.abc import AsyncGenerator, Callable, Mapping
|
|
12
|
+
from contextlib import AbstractAsyncContextManager
|
|
13
|
+
from functools import partial, wraps
|
|
14
|
+
from types import MappingProxyType
|
|
15
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
16
|
+
|
|
17
|
+
from hare.core.log import db_client_logger
|
|
18
|
+
from hare.dialects.base.client.connection_ping import ConnectionPing
|
|
19
|
+
from hare.dialects.base.client.constants import (
|
|
20
|
+
DISCARDED_CLIENT_MESSAGE,
|
|
21
|
+
PING_TIMEOUT_SECONDS,
|
|
22
|
+
UNENCODABLE_SURROGATE_MESSAGE,
|
|
23
|
+
UNENCODABLE_SURROGATE_REASON,
|
|
24
|
+
)
|
|
25
|
+
from hare.dialects.base.client.pool.pool_statistics import PoolStatistics
|
|
26
|
+
from hare.dialects.base.constants import (
|
|
27
|
+
COMMAND_TIMEOUT_METHOD_NAMES,
|
|
28
|
+
OBSERVED_METHOD_NAMES,
|
|
29
|
+
QUERY_EXECUTING_METHOD_NAMES,
|
|
30
|
+
)
|
|
31
|
+
from hare.dialects.base.dialect import Dialect
|
|
32
|
+
from hare.dialects.base.features import Features
|
|
33
|
+
from hare.dialects.base.results.described_result import DescribedResult
|
|
34
|
+
from hare.dialects.base.results.statement_result import StatementResult
|
|
35
|
+
from hare.dialects.base.transactions.contexts.non_transactional_context import NonTransactionalContext
|
|
36
|
+
from hare.dialects.base.transactions.contexts.top_level_transaction_context import TopLevelTransactionContext
|
|
37
|
+
from hare.dialects.base.transactions.contexts.transaction_context import TransactionContext
|
|
38
|
+
from hare.dialects.dialect_registry import DialectRegistry
|
|
39
|
+
from hare.exceptions import (
|
|
40
|
+
DatabaseError,
|
|
41
|
+
DBConnectionError,
|
|
42
|
+
OperationalError,
|
|
43
|
+
TransactionManagementError,
|
|
44
|
+
TransactionRetryError,
|
|
45
|
+
UnSupportedError,
|
|
46
|
+
ValidationError,
|
|
47
|
+
)
|
|
48
|
+
from hare.instrumentation.declarations import PoolStatus, QueryCall
|
|
49
|
+
from hare.instrumentation.enums import PoolRole
|
|
50
|
+
from hare.instrumentation.observers.observers import Observers
|
|
51
|
+
from hare.instrumentation.pools.pool_registry import PoolRegistry
|
|
52
|
+
from hare.instrumentation.queries.query_tags import QueryTags
|
|
53
|
+
from hare.sql import Query
|
|
54
|
+
from hare.sql.terms.parameters.query_parameters import QueryParameters
|
|
55
|
+
from hare.transactions.transaction_options import TransactionOptions
|
|
56
|
+
|
|
57
|
+
if TYPE_CHECKING:
|
|
58
|
+
from hare.core.connections.connection_handler import ConnectionHandler
|
|
59
|
+
from hare.dialects.base.client.declarations import ShellCommand
|
|
60
|
+
from hare.dialects.base.client.password_provider import PasswordProvider
|
|
61
|
+
from hare.dialects.base.client.transaction_client import TransactionClient
|
|
62
|
+
from hare.dialects.base.connection.driver import Driver
|
|
63
|
+
from hare.models import Model
|
|
64
|
+
from hare.dialects.base.client.connection_wrapper import ConnectionWrapper
|
|
65
|
+
from hare.dialects.base.client.pool.pool_connection_wrapper import PoolConnectionWrapper
|
|
66
|
+
|
|
67
|
+
#: Set while a read-only query runs - a connection lost during it may be retried on a fresh
|
|
68
|
+
#: connection. A write never sets it.
|
|
69
|
+
retryable_read_query_active: contextvars.ContextVar[bool] = contextvars.ContextVar(
|
|
70
|
+
"retryable_read_query_active", default=False
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class DatabaseClient(abc.ABC):
|
|
75
|
+
"""
|
|
76
|
+
The base of the clients of a database connection: its pool, its statements and its transactions.
|
|
77
|
+
|
|
78
|
+
Parameters get passed as kwargs, and is mostly driver specific.
|
|
79
|
+
|
|
80
|
+
Attributes:
|
|
81
|
+
query_class: The Query dialect (low level dialect).
|
|
82
|
+
dialect: The SQL dialect of the database.
|
|
83
|
+
features: What the database and the driver support.
|
|
84
|
+
driver_name: The name of the driver the client belongs to (``Driver.name``).
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
_connection: Any
|
|
88
|
+
_parent: DatabaseClient
|
|
89
|
+
_pool: Any
|
|
90
|
+
#: Set once the connection is closed and dropped (``close_all(discard=True)``) - it opens no pool
|
|
91
|
+
#: again for a task still holding it.
|
|
92
|
+
discarded: bool = False
|
|
93
|
+
#: The client of the same connection in the context a repeated ``Hare.init()`` set up - a query that
|
|
94
|
+
#: took this client before it was discarded runs there.
|
|
95
|
+
replaced_by: DatabaseClient | None = None
|
|
96
|
+
#: The closes begun - a connection or pool that opened across one belongs to no client and is
|
|
97
|
+
#: closed.
|
|
98
|
+
closes_started: int = 0
|
|
99
|
+
#: The task opening the connection or pool, while it does - its own setup statements run on it.
|
|
100
|
+
opening_task: asyncio.Task[Any] | None = None
|
|
101
|
+
_bound_loop: asyncio.AbstractEventLoop | None = None
|
|
102
|
+
#: The server's version read when the pool opened (``get_server_version()``) - None before that,
|
|
103
|
+
#: or when the driver doesn't know it.
|
|
104
|
+
server_version: tuple[int, ...] | None = None
|
|
105
|
+
connection_alias: str
|
|
106
|
+
query_class: type[Query] = Query
|
|
107
|
+
#: The Python types the driver returns a column's value as already - a field of such a type
|
|
108
|
+
#: reads it without converting.
|
|
109
|
+
native_python_types: ClassVar[frozenset[type]] = frozenset(
|
|
110
|
+
{bytes, str, int, float, decimal.Decimal, datetime.datetime, datetime.date}
|
|
111
|
+
)
|
|
112
|
+
#: Whether the client runs its statements inside a transaction - a ``TransactionClient``. Read on
|
|
113
|
+
#: every statement: ``isinstance()`` against the abstract class costs two calls more.
|
|
114
|
+
is_transaction_client: ClassVar[bool] = False
|
|
115
|
+
#: How many times a read that lost its connection is retried on a fresh one - set by the
|
|
116
|
+
#: clients that retry; none by default.
|
|
117
|
+
read_retry_max_retries: int = 0
|
|
118
|
+
#: The tenant schema settings - set by __init__; a transaction client takes its connection's.
|
|
119
|
+
tenant_schema_template: str | None = None
|
|
120
|
+
tenant_schema: str | None = None
|
|
121
|
+
tenant_client_settings: Mapping[str, Any] = MappingProxyType({})
|
|
122
|
+
tenant_row_level_security: bool = False
|
|
123
|
+
#: Which client of its connection this one is - set by whoever makes it; a transaction client
|
|
124
|
+
#: takes its connection's.
|
|
125
|
+
pool_role: PoolRole = PoolRole.MAIN
|
|
126
|
+
#: The connection handler that made the client - the pools of a context are its handler's.
|
|
127
|
+
connection_handler: ConnectionHandler | None = None
|
|
128
|
+
dialect: Dialect
|
|
129
|
+
features: Features = Features()
|
|
130
|
+
#: Whether the client cancels an over-running statement itself, without a statement of the
|
|
131
|
+
#: dialect's - a statement-time-limited transaction then needs no setup statement.
|
|
132
|
+
enforces_statement_timeout_itself: ClassVar[bool] = False
|
|
133
|
+
#: Whether the client applies a transaction's lock timeout itself, without a statement of
|
|
134
|
+
#: the dialect's - a busy timeout of the connection, say.
|
|
135
|
+
enforces_lock_timeout_itself: ClassVar[bool] = False
|
|
136
|
+
driver_name: str
|
|
137
|
+
#: Where the client takes its password from - None for a fixed password
|
|
138
|
+
#: (``password_provider``).
|
|
139
|
+
password_provider: PasswordProvider | None = None
|
|
140
|
+
|
|
141
|
+
#: A character the dialect refuses in a statement's text before it is sent - None for none
|
|
142
|
+
#: (``raise_rejected_sql_character()``).
|
|
143
|
+
rejected_sql_character: ClassVar[str | None] = None
|
|
144
|
+
#: The loggers of the client's driver library (``quiet_driver_loggers()``).
|
|
145
|
+
driver_logger_names: ClassVar[tuple[str, ...]] = ()
|
|
146
|
+
#: Whether a client made now keeps its driver library's warnings out of the output when nothing
|
|
147
|
+
#: configured logging - the command line sets it: hare reports a failure itself.
|
|
148
|
+
quiets_driver_loggers: ClassVar[bool] = False
|
|
149
|
+
#: Whether a statement on a transaction client checks first that the transaction isn't
|
|
150
|
+
#: aborted (``_is_transaction_aborted()``).
|
|
151
|
+
checks_aborted_transactions: ClassVar[bool] = False
|
|
152
|
+
#: The message of the error a statement in an aborted transaction raises.
|
|
153
|
+
aborted_transaction_message: ClassVar[str] = ""
|
|
154
|
+
#: Whether the client's statements take the statement options - ``command_timeout``,
|
|
155
|
+
#: ``password_provider``, ``transaction_pooling``, ``read_retry_max_retries``.
|
|
156
|
+
runs_statement_options: ClassVar[bool] = False
|
|
157
|
+
#: Runs a method once more with a new password when the server refused the pool's -
|
|
158
|
+
#: ``(method, client, *args, **kwargs)``.
|
|
159
|
+
run_renewing_refused_password: ClassVar[Callable[..., Any] | None] = None
|
|
160
|
+
#: The longest a statement may run, cancelled by the client itself - None for no limit.
|
|
161
|
+
command_timeout: float | None = None
|
|
162
|
+
#: Whether the connection goes through a pooler sharing server connections by transaction.
|
|
163
|
+
transaction_pooling: bool = False
|
|
164
|
+
|
|
165
|
+
@classmethod
|
|
166
|
+
def translate_exceptions(cls, function: Callable[..., Any]) -> Callable[..., Any]:
|
|
167
|
+
"""Wraps a client method: appends the query tags to its SQL, runs it inside the query
|
|
168
|
+
wrappers, raises the driver's exceptions as hare's (``translate_driver_error()``) and
|
|
169
|
+
reports the query to the observers. The dialect's hooks are read once, here - ``cls`` is the
|
|
170
|
+
dialect's client class the decorator is taken from.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
function: The method.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
The wrapped method.
|
|
177
|
+
"""
|
|
178
|
+
method_name = function.__name__
|
|
179
|
+
is_query_executing = method_name in QUERY_EXECUTING_METHOD_NAMES
|
|
180
|
+
is_observed = method_name in OBSERVED_METHOD_NAMES
|
|
181
|
+
is_command_timeout_bounded = method_name in COMMAND_TIMEOUT_METHOD_NAMES
|
|
182
|
+
runs_statement_options = cls.runs_statement_options
|
|
183
|
+
run_renewing_refused_password = cls.run_renewing_refused_password
|
|
184
|
+
translate_driver_error = cls.translate_driver_error
|
|
185
|
+
rejected_character = cls.rejected_sql_character
|
|
186
|
+
checks_aborted_transactions = cls.checks_aborted_transactions
|
|
187
|
+
|
|
188
|
+
def get_translating_method(wrapped_method: Callable[..., Any] | None) -> Callable[..., Any]:
|
|
189
|
+
# wrapped_method: the method the query wrappers run, its SQL tagged already - None
|
|
190
|
+
# for that method itself.
|
|
191
|
+
tags_sql = wrapped_method is not None
|
|
192
|
+
runs_query_wrappers = is_observed and wrapped_method is not None
|
|
193
|
+
|
|
194
|
+
async def bound_by_command_timeout(client: Any, *args: Any, **kwargs: Any) -> Any:
|
|
195
|
+
return await client._run_with_command_timeout(function, *args, **kwargs)
|
|
196
|
+
|
|
197
|
+
async def translating_method(self: Any, *args: Any, **kwargs: Any) -> Any:
|
|
198
|
+
if is_query_executing and not (tags_sql and QueryTags.current.get()):
|
|
199
|
+
sql = args[0] if args else kwargs.get("query")
|
|
200
|
+
parameters = args[1] if len(args) > 1 else kwargs.get("values")
|
|
201
|
+
else:
|
|
202
|
+
args, kwargs, sql, parameters = DatabaseClient.get_tagged_query_arguments(
|
|
203
|
+
args, kwargs, method_name, self
|
|
204
|
+
)
|
|
205
|
+
if runs_query_wrappers and Observers.query_wrappers:
|
|
206
|
+
call = QueryCall(method_name, cast("str", sql), parameters, self.connection_alias, self.dialect)
|
|
207
|
+
return await Observers.run_wrapped(
|
|
208
|
+
call, partial(cast("Callable[..., Any]", wrapped_method), self, *args, **kwargs)
|
|
209
|
+
)
|
|
210
|
+
if rejected_character is not None and sql is not None and rejected_character in sql:
|
|
211
|
+
# Refused before it is sent, so an open transaction isn't aborted by it.
|
|
212
|
+
self.raise_rejected_sql_character(sql)
|
|
213
|
+
start = time.perf_counter()
|
|
214
|
+
exception: Exception | None = None
|
|
215
|
+
# False for the read retry, which records each of its attempts itself.
|
|
216
|
+
record_here = True
|
|
217
|
+
is_transaction_client = self.is_transaction_client
|
|
218
|
+
try:
|
|
219
|
+
# A stale reference to a finished transaction or savepoint must not run a query -
|
|
220
|
+
# its connection may already serve another transaction.
|
|
221
|
+
if is_query_executing and is_transaction_client:
|
|
222
|
+
self._check_statement_allowed()
|
|
223
|
+
if checks_aborted_transactions and self._is_transaction_aborted():
|
|
224
|
+
raise TransactionManagementError(self.aborted_transaction_message)
|
|
225
|
+
if not runs_statement_options:
|
|
226
|
+
return await function(self, *args, **kwargs)
|
|
227
|
+
method: Callable[..., Any] = (
|
|
228
|
+
bound_by_command_timeout
|
|
229
|
+
if is_command_timeout_bounded and self.command_timeout is not None
|
|
230
|
+
else function
|
|
231
|
+
)
|
|
232
|
+
if self.password_provider is not None and not is_transaction_client:
|
|
233
|
+
method = partial(cast("Callable[..., Any]", run_renewing_refused_password), method)
|
|
234
|
+
# Only a client outside a transaction retries a read: a transaction's pinned
|
|
235
|
+
# connection is dead, and the read would run outside its isolation.
|
|
236
|
+
if (
|
|
237
|
+
is_query_executing
|
|
238
|
+
and self.read_retry_max_retries
|
|
239
|
+
and not is_transaction_client
|
|
240
|
+
and retryable_read_query_active.get()
|
|
241
|
+
):
|
|
242
|
+
record_here = False
|
|
243
|
+
return await self._execute_read_query_with_retry(
|
|
244
|
+
method, *args, sql=sql, parameters=parameters, **kwargs
|
|
245
|
+
)
|
|
246
|
+
return await method(self, *args, **kwargs)
|
|
247
|
+
except BaseException as driver_error:
|
|
248
|
+
if DatabaseClient.is_unencodable_surrogate_error(driver_error):
|
|
249
|
+
# A driver encoding a value - its own error names no rule, and holds the text:
|
|
250
|
+
# raised once the driver's is no longer handled, so it isn't the context either.
|
|
251
|
+
exception = ValidationError(UNENCODABLE_SURROGATE_MESSAGE)
|
|
252
|
+
else:
|
|
253
|
+
error = translate_driver_error(self, driver_error, sql, parameters, args, is_query_executing)
|
|
254
|
+
if error is driver_error:
|
|
255
|
+
if isinstance(error, Exception):
|
|
256
|
+
exception = error
|
|
257
|
+
raise
|
|
258
|
+
hidden_values = QueryParameters.get_hidden_values_of(parameters)
|
|
259
|
+
if not (isinstance(error, DatabaseError) and (hidden_values or error.hides_driver_error)):
|
|
260
|
+
if isinstance(error, Exception):
|
|
261
|
+
exception = error
|
|
262
|
+
raise error from driver_error
|
|
263
|
+
# The driver's error may hold a sensitive field's value - in its message, its
|
|
264
|
+
# attributes (a detail of the server) or its repr: raised once the driver's is no
|
|
265
|
+
# longer handled, so it isn't the context either.
|
|
266
|
+
error.drop_values(hidden_values)
|
|
267
|
+
exception = error
|
|
268
|
+
finally:
|
|
269
|
+
if is_observed and record_here:
|
|
270
|
+
Observers.record_query(sql, parameters, start, exception, self.connection_alias)
|
|
271
|
+
raise exception
|
|
272
|
+
|
|
273
|
+
return translating_method
|
|
274
|
+
|
|
275
|
+
return wraps(function)(get_translating_method(get_translating_method(None)))
|
|
276
|
+
|
|
277
|
+
def get_result_read_error(self, error: Exception) -> Exception | None:
|
|
278
|
+
"""The hare exception of an error a driver raises reading a value of a result after the
|
|
279
|
+
statement returned - a driver decoding its rows when they are read.
|
|
280
|
+
|
|
281
|
+
Args:
|
|
282
|
+
error: The exception.
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
None by default - for a driver decoding every value before the statement returns.
|
|
286
|
+
"""
|
|
287
|
+
return None
|
|
288
|
+
|
|
289
|
+
@staticmethod
|
|
290
|
+
def is_missing_conflict_target_error(error: BaseException) -> bool:
|
|
291
|
+
"""Whether an INSERT failed because its ``ON CONFLICT`` names columns no unique index or
|
|
292
|
+
constraint of the table has.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
error: The exception, hare's or the driver's.
|
|
296
|
+
|
|
297
|
+
Returns:
|
|
298
|
+
False by default - for a database checking the target itself before the statement.
|
|
299
|
+
"""
|
|
300
|
+
return False
|
|
301
|
+
|
|
302
|
+
@staticmethod
|
|
303
|
+
def is_unencodable_surrogate_error(error: BaseException) -> bool:
|
|
304
|
+
"""Whether a driver failed to encode a text holding a lone surrogate - raised as Python's own
|
|
305
|
+
error, or as the driver's with that one as its cause.
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
error: The exception.
|
|
309
|
+
|
|
310
|
+
Returns:
|
|
311
|
+
True for such an error.
|
|
312
|
+
"""
|
|
313
|
+
encoding_error = error if isinstance(error, UnicodeEncodeError) else error.__cause__
|
|
314
|
+
return isinstance(encoding_error, UnicodeEncodeError) and encoding_error.reason == UNENCODABLE_SURROGATE_REASON
|
|
315
|
+
|
|
316
|
+
@staticmethod
|
|
317
|
+
def translate_driver_error(
|
|
318
|
+
client: Any,
|
|
319
|
+
error: BaseException,
|
|
320
|
+
sql: str | None,
|
|
321
|
+
parameters: Any,
|
|
322
|
+
args: tuple[Any, ...],
|
|
323
|
+
is_query_executing: bool,
|
|
324
|
+
) -> BaseException:
|
|
325
|
+
"""The hare exception of what a wrapped method raised - the error itself to raise it as it is.
|
|
326
|
+
|
|
327
|
+
Args:
|
|
328
|
+
client: The client the method ran on.
|
|
329
|
+
error: The exception.
|
|
330
|
+
sql: The statement, None for a method running none.
|
|
331
|
+
parameters: Its parameters.
|
|
332
|
+
args: The method's positional arguments.
|
|
333
|
+
is_query_executing: Whether the method runs a statement.
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
The exception to raise.
|
|
337
|
+
"""
|
|
338
|
+
return error
|
|
339
|
+
|
|
340
|
+
def raise_rejected_sql_character(self, sql: str) -> None:
|
|
341
|
+
"""Raises for a statement holding ``rejected_sql_character``.
|
|
342
|
+
|
|
343
|
+
Args:
|
|
344
|
+
sql: The statement.
|
|
345
|
+
"""
|
|
346
|
+
raise NotImplementedError
|
|
347
|
+
|
|
348
|
+
@staticmethod
|
|
349
|
+
def get_tagged_query_arguments(
|
|
350
|
+
args: tuple[Any, ...],
|
|
351
|
+
kwargs: dict[str, Any],
|
|
352
|
+
method_name: str,
|
|
353
|
+
client: Any,
|
|
354
|
+
) -> tuple[tuple[Any, ...], dict[str, Any], str | None, Any]:
|
|
355
|
+
"""Reads the SQL and its parameters off the arguments of a client method the dialect's
|
|
356
|
+
exception-translating decorator wraps, and appends the active query tags
|
|
357
|
+
(``QueryTags``) to the SQL. A bulk load's SQL is the dialect's statement of it
|
|
358
|
+
(``QueryClauses.get_bulk_load_statement_sql()``); a method running no query - commit(),
|
|
359
|
+
rollback() - has none.
|
|
360
|
+
|
|
361
|
+
Args:
|
|
362
|
+
args: The method's positional arguments - the SQL first, its parameters second.
|
|
363
|
+
kwargs: Its keyword arguments - ``query`` and ``values``.
|
|
364
|
+
method_name: The method.
|
|
365
|
+
client: The client the method is called on - its dialect names a bulk load.
|
|
366
|
+
|
|
367
|
+
Returns:
|
|
368
|
+
The arguments with the tagged SQL, the SQL, and its parameters - None for no query.
|
|
369
|
+
"""
|
|
370
|
+
if method_name == "copy":
|
|
371
|
+
table = args[0] if args else kwargs["table"]
|
|
372
|
+
columns = args[1] if len(args) > 1 else kwargs["columns"]
|
|
373
|
+
bulk_load_sql = client.dialect.clauses.get_bulk_load_statement_sql(table, columns)
|
|
374
|
+
return args, kwargs, QueryTags.append(bulk_load_sql), None
|
|
375
|
+
if method_name not in QUERY_EXECUTING_METHOD_NAMES:
|
|
376
|
+
return args, kwargs, None, None
|
|
377
|
+
sql = args[0] if args else kwargs.get("query")
|
|
378
|
+
parameters = args[1] if len(args) > 1 else kwargs.get("values")
|
|
379
|
+
if sql is not None:
|
|
380
|
+
tagged_sql = QueryTags.append(sql, client.dialect)
|
|
381
|
+
if tagged_sql is not sql:
|
|
382
|
+
if args:
|
|
383
|
+
args = (tagged_sql, *args[1:])
|
|
384
|
+
else:
|
|
385
|
+
kwargs = {**kwargs, "query": tagged_sql}
|
|
386
|
+
sql = tagged_sql
|
|
387
|
+
return args, kwargs, sql, parameters
|
|
388
|
+
|
|
389
|
+
def __init__(self, connection_alias: str, **kwargs: Any) -> None:
|
|
390
|
+
self.log = db_client_logger
|
|
391
|
+
self.connection_alias = connection_alias
|
|
392
|
+
#: The schema name template of the tenants' schemas (``tenant_{tenant}``) - None when the
|
|
393
|
+
#: connection has no schema per tenant.
|
|
394
|
+
self.tenant_schema_template: str | None = None
|
|
395
|
+
#: The tenant schema this client works in - None for a connection's own client.
|
|
396
|
+
self.tenant_schema: str | None = None
|
|
397
|
+
#: The settings over its connection's own this client of a tenant schema was made with.
|
|
398
|
+
self.tenant_client_settings: Mapping[str, Any] = MappingProxyType({})
|
|
399
|
+
#: Whether a transaction sets its tenants for the ``TenantCondition`` policies.
|
|
400
|
+
self.tenant_row_level_security = False
|
|
401
|
+
#: The client of each tenant schema, made on its first use - closed with this client.
|
|
402
|
+
self.tenant_clients: dict[str, DatabaseClient] = {}
|
|
403
|
+
#: What the client's pool has done - kept across reconnects, which replace the pool.
|
|
404
|
+
self.pool_statistics: Any = self.create_pool_statistics()
|
|
405
|
+
if DatabaseClient.quiets_driver_loggers:
|
|
406
|
+
self.quiet_driver_loggers()
|
|
407
|
+
|
|
408
|
+
@classmethod
|
|
409
|
+
def quiet_driver_loggers(cls) -> None:
|
|
410
|
+
"""Gives the driver library's loggers a ``NullHandler`` when nothing configured logging -
|
|
411
|
+
Python would print their warnings, a failed connect's traceback among them, through its
|
|
412
|
+
last-resort handler. A configured logging still receives them."""
|
|
413
|
+
if not cls.driver_logger_names or logging.getLogger().handlers:
|
|
414
|
+
return
|
|
415
|
+
for logger_name in cls.driver_logger_names:
|
|
416
|
+
driver_logger = logging.getLogger(logger_name)
|
|
417
|
+
if not driver_logger.handlers:
|
|
418
|
+
driver_logger.addHandler(logging.NullHandler())
|
|
419
|
+
|
|
420
|
+
def enforces_foreign_keys(self) -> bool:
|
|
421
|
+
"""Whether the database enforces foreign keys on this connection now - a hard delete cascades
|
|
422
|
+
in Python where it doesn't.
|
|
423
|
+
|
|
424
|
+
Returns:
|
|
425
|
+
``Features.supports_foreign_keys`` by default.
|
|
426
|
+
"""
|
|
427
|
+
return self.features.supports_foreign_keys
|
|
428
|
+
|
|
429
|
+
def hold_migration_lock(self) -> AbstractAsyncContextManager[None]:
|
|
430
|
+
"""Holds hare's migration lock for a ``migrate`` run on a database without a lock statement
|
|
431
|
+
(``get_migration_lock_sql()``): two processes migrating one database apply their migrations
|
|
432
|
+
one after the other.
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
The hold - one holding nothing by default.
|
|
436
|
+
"""
|
|
437
|
+
return contextlib.nullcontext()
|
|
438
|
+
|
|
439
|
+
def get_successor(self) -> DatabaseClient | None:
|
|
440
|
+
"""The client a query that took this one runs on once it is discarded - the one replacing it,
|
|
441
|
+
of its own class.
|
|
442
|
+
|
|
443
|
+
Returns:
|
|
444
|
+
The client, None while this one runs its queries or when nothing replaced it.
|
|
445
|
+
"""
|
|
446
|
+
successor = self.replaced_by
|
|
447
|
+
if not self.discarded or successor is None or type(successor) is not type(self):
|
|
448
|
+
return None
|
|
449
|
+
return successor
|
|
450
|
+
|
|
451
|
+
def get_tenant_client(self) -> DatabaseClient:
|
|
452
|
+
"""The client the active tenant scope works through - the client of the tenant's schema when
|
|
453
|
+
the connection has a schema per tenant and the scope is one tenant, else this client.
|
|
454
|
+
|
|
455
|
+
Returns:
|
|
456
|
+
The client.
|
|
457
|
+
"""
|
|
458
|
+
if self.tenant_schema is not None or self.tenant_schema_template is None:
|
|
459
|
+
return self
|
|
460
|
+
# Local import: the tenant schemas import the models, which import the dialects.
|
|
461
|
+
from hare.models.tenancy.tenant_schemas import TenantSchemas
|
|
462
|
+
|
|
463
|
+
schema_name = TenantSchemas.get_active_schema_name(self)
|
|
464
|
+
if schema_name is None:
|
|
465
|
+
return self
|
|
466
|
+
return self.get_schema_client(schema_name)
|
|
467
|
+
|
|
468
|
+
def get_schema_client(self, schema_name: str) -> DatabaseClient:
|
|
469
|
+
"""The client of one tenant's schema, made on its first use.
|
|
470
|
+
|
|
471
|
+
Args:
|
|
472
|
+
schema_name: The tenant's schema.
|
|
473
|
+
|
|
474
|
+
Returns:
|
|
475
|
+
The client.
|
|
476
|
+
|
|
477
|
+
Raises:
|
|
478
|
+
UnSupportedError: The database has no schemas per tenant.
|
|
479
|
+
DBConnectionError: This client was closed and dropped, and nothing replaced it - a client made
|
|
480
|
+
now would open connections nothing closes.
|
|
481
|
+
"""
|
|
482
|
+
tenant_client = self.tenant_clients.get(schema_name)
|
|
483
|
+
if tenant_client is None:
|
|
484
|
+
if self.discarded:
|
|
485
|
+
successor = self.get_successor()
|
|
486
|
+
if successor is None:
|
|
487
|
+
raise DBConnectionError(DISCARDED_CLIENT_MESSAGE.format(alias=self.connection_alias))
|
|
488
|
+
return successor.get_schema_client(schema_name)
|
|
489
|
+
tenant_client = self.tenant_clients[schema_name] = self._create_client(
|
|
490
|
+
{}, self.get_tenant_client_settings(schema_name), schema_name
|
|
491
|
+
)
|
|
492
|
+
tenant_client.pool_role = PoolRole.TENANT_SCHEMA
|
|
493
|
+
return tenant_client
|
|
494
|
+
|
|
495
|
+
def create_independent_client(self, settings: Mapping[str, Any] | None = None) -> DatabaseClient:
|
|
496
|
+
"""A new connection to this client's database, apart from it and in the same tenant schema.
|
|
497
|
+
The caller closes it.
|
|
498
|
+
|
|
499
|
+
Args:
|
|
500
|
+
settings: Settings replacing the connection's own.
|
|
501
|
+
|
|
502
|
+
Returns:
|
|
503
|
+
The client.
|
|
504
|
+
"""
|
|
505
|
+
return self._create_client(settings or {}, self.tenant_client_settings, self.tenant_schema)
|
|
506
|
+
|
|
507
|
+
def _create_client(
|
|
508
|
+
self, settings: Mapping[str, Any], tenant_client_settings: Mapping[str, Any], tenant_schema: str | None
|
|
509
|
+
) -> DatabaseClient:
|
|
510
|
+
"""A new connection to this client's database.
|
|
511
|
+
|
|
512
|
+
Args:
|
|
513
|
+
settings: Settings replacing the connection's own.
|
|
514
|
+
tenant_client_settings: The settings of the tenant schema it works in.
|
|
515
|
+
tenant_schema: The tenant schema it works in, None for none.
|
|
516
|
+
|
|
517
|
+
Returns:
|
|
518
|
+
The client.
|
|
519
|
+
"""
|
|
520
|
+
# Local import: the connections import the dialects.
|
|
521
|
+
from hare.core.connections.connections import Connections
|
|
522
|
+
|
|
523
|
+
client = Connections.current().create_independent(
|
|
524
|
+
self.connection_alias, {**settings, **tenant_client_settings}
|
|
525
|
+
)
|
|
526
|
+
client.tenant_schema_template = self.tenant_schema_template
|
|
527
|
+
client.tenant_schema = tenant_schema
|
|
528
|
+
client.tenant_client_settings = tenant_client_settings
|
|
529
|
+
return client
|
|
530
|
+
|
|
531
|
+
async def enter_tenant_schema(self, schema_name: str) -> str:
|
|
532
|
+
"""Runs the rest of the transaction in another tenant's schema, in place of its own.
|
|
533
|
+
|
|
534
|
+
Args:
|
|
535
|
+
schema_name: The tenant's schema.
|
|
536
|
+
|
|
537
|
+
Returns:
|
|
538
|
+
What ``leave_tenant_schema()`` takes to come back.
|
|
539
|
+
|
|
540
|
+
Raises:
|
|
541
|
+
UnSupportedError: The database has no schemas per tenant.
|
|
542
|
+
"""
|
|
543
|
+
raise UnSupportedError(f"The {self.dialect} dialect has no schema per tenant")
|
|
544
|
+
|
|
545
|
+
async def leave_tenant_schema(self, previous_schemas: str) -> None:
|
|
546
|
+
"""Brings the transaction back to the schema ``enter_tenant_schema()`` left.
|
|
547
|
+
|
|
548
|
+
Args:
|
|
549
|
+
previous_schemas: What ``enter_tenant_schema()`` returned.
|
|
550
|
+
|
|
551
|
+
Raises:
|
|
552
|
+
UnSupportedError: The database has no schemas per tenant.
|
|
553
|
+
"""
|
|
554
|
+
raise UnSupportedError(f"The {self.dialect} dialect has no schema per tenant")
|
|
555
|
+
|
|
556
|
+
def get_tenant_client_settings(self, schema_name: str) -> dict[str, Any]:
|
|
557
|
+
"""The connection settings of a tenant schema's client - its search path.
|
|
558
|
+
|
|
559
|
+
Args:
|
|
560
|
+
schema_name: The tenant's schema.
|
|
561
|
+
|
|
562
|
+
Returns:
|
|
563
|
+
The settings replacing the connection's own.
|
|
564
|
+
|
|
565
|
+
Raises:
|
|
566
|
+
UnSupportedError: The database has no schemas per tenant.
|
|
567
|
+
"""
|
|
568
|
+
raise UnSupportedError(f"The {self.dialect} dialect has no schema per tenant")
|
|
569
|
+
|
|
570
|
+
async def close_tenant_clients(self) -> None:
|
|
571
|
+
"""Closes the clients of the tenant schemas."""
|
|
572
|
+
tenant_clients = list(self.tenant_clients.values())
|
|
573
|
+
self.tenant_clients.clear()
|
|
574
|
+
for tenant_client in tenant_clients:
|
|
575
|
+
await tenant_client.close()
|
|
576
|
+
|
|
577
|
+
def abandon_connections(self) -> None:
|
|
578
|
+
"""Drops the connections opened on an event loop that is closed - they can't be closed through
|
|
579
|
+
it; nothing by default, for a driver whose connections need no event loop to close.
|
|
580
|
+
"""
|
|
581
|
+
|
|
582
|
+
def _check_loop(self) -> bool:
|
|
583
|
+
"""Whether the running event loop is the one the client was created on."""
|
|
584
|
+
try:
|
|
585
|
+
current = asyncio.get_running_loop()
|
|
586
|
+
except RuntimeError:
|
|
587
|
+
return True # No running loop — can't validate
|
|
588
|
+
if self._bound_loop is None:
|
|
589
|
+
return True # Not yet bound (pool not created yet)
|
|
590
|
+
return self._bound_loop is current
|
|
591
|
+
|
|
592
|
+
async def _post_connect(self) -> None:
|
|
593
|
+
"""Called after pool/connection is created. Records the bound loop, refuses a server older
|
|
594
|
+
than the dialect runs on (``Dialect.check_server_version()``, closing what was just
|
|
595
|
+
opened) and applies the features the server's version changes
|
|
596
|
+
(``Dialect.get_server_version_features()``).
|
|
597
|
+
|
|
598
|
+
Raises:
|
|
599
|
+
UnSupportedError: The server is older than the dialect's ``minimum_server_version``.
|
|
600
|
+
"""
|
|
601
|
+
self._bound_loop = asyncio.get_running_loop()
|
|
602
|
+
PoolRegistry.add(self)
|
|
603
|
+
server_version = self.server_version = await self.get_server_version()
|
|
604
|
+
if server_version is None:
|
|
605
|
+
return
|
|
606
|
+
try:
|
|
607
|
+
self.dialect.check_server_version(server_version)
|
|
608
|
+
except UnSupportedError:
|
|
609
|
+
await self.close()
|
|
610
|
+
raise
|
|
611
|
+
changed_features = {
|
|
612
|
+
name: value
|
|
613
|
+
for name, value in self.dialect.get_server_version_features(server_version).items()
|
|
614
|
+
if getattr(self.features, name) != value
|
|
615
|
+
}
|
|
616
|
+
if changed_features:
|
|
617
|
+
self.features = self.features.replace(**changed_features)
|
|
618
|
+
|
|
619
|
+
def create_pool_statistics(self) -> Any:
|
|
620
|
+
"""The object counting what the client's pool does - a driver whose pool lives outside Python
|
|
621
|
+
returns its own, with ``PoolStatistics``'s methods.
|
|
622
|
+
|
|
623
|
+
Returns:
|
|
624
|
+
The statistics.
|
|
625
|
+
"""
|
|
626
|
+
return PoolStatistics()
|
|
627
|
+
|
|
628
|
+
def get_pool_status(self) -> PoolStatus | None:
|
|
629
|
+
"""What the client's pool of connections holds and has done right now.
|
|
630
|
+
|
|
631
|
+
Returns:
|
|
632
|
+
The status - of no connection while the pool isn't open but failed to open; None while
|
|
633
|
+
it isn't open and opened none.
|
|
634
|
+
|
|
635
|
+
Raises:
|
|
636
|
+
UnSupportedError: The client reports no pool status (``Features.supports_pool_status``).
|
|
637
|
+
"""
|
|
638
|
+
if not self.features.supports_pool_status:
|
|
639
|
+
raise UnSupportedError(
|
|
640
|
+
f"The {self.driver_name} client of {self.connection_alias!r} reports no pool status"
|
|
641
|
+
)
|
|
642
|
+
acquire_count, acquire_timeouts, acquire_wait_seconds_total, connect_count, connect_failures = (
|
|
643
|
+
self.pool_statistics.get_counts()
|
|
644
|
+
)
|
|
645
|
+
occupancy = self.get_pool_occupancy()
|
|
646
|
+
if occupancy is None:
|
|
647
|
+
if not connect_failures:
|
|
648
|
+
return None
|
|
649
|
+
# A pool failing to open - its failures are what there is to see.
|
|
650
|
+
occupancy = (0, 0, 0, *self.get_pool_bounds())
|
|
651
|
+
size, idle, waiting, min_size, max_size = occupancy
|
|
652
|
+
return PoolStatus(
|
|
653
|
+
self.connection_alias,
|
|
654
|
+
self.pool_role,
|
|
655
|
+
self.tenant_schema,
|
|
656
|
+
size,
|
|
657
|
+
idle,
|
|
658
|
+
size - idle,
|
|
659
|
+
waiting,
|
|
660
|
+
min_size,
|
|
661
|
+
max_size,
|
|
662
|
+
acquire_count,
|
|
663
|
+
acquire_timeouts,
|
|
664
|
+
acquire_wait_seconds_total,
|
|
665
|
+
connect_count,
|
|
666
|
+
connect_failures,
|
|
667
|
+
)
|
|
668
|
+
|
|
669
|
+
def get_server_client(self) -> DatabaseClient:
|
|
670
|
+
"""The client of the database server itself, past any pooler the connection goes through -
|
|
671
|
+
this client for a connection going straight to the server.
|
|
672
|
+
|
|
673
|
+
Returns:
|
|
674
|
+
The client.
|
|
675
|
+
"""
|
|
676
|
+
return self
|
|
677
|
+
|
|
678
|
+
def apply_password(self, password: str) -> None:
|
|
679
|
+
"""Opens the client's new connections with ``password`` from now on - a renewed password of
|
|
680
|
+
``password_provider``. Nothing for a driver that asks the provider itself for every
|
|
681
|
+
connection it opens.
|
|
682
|
+
|
|
683
|
+
Args:
|
|
684
|
+
password: The password.
|
|
685
|
+
"""
|
|
686
|
+
|
|
687
|
+
async def get_shell_command(self) -> ShellCommand | None:
|
|
688
|
+
"""The interactive client of the database this connection opens (``hare dbshell``) - None
|
|
689
|
+
for a dialect that names none.
|
|
690
|
+
|
|
691
|
+
Returns:
|
|
692
|
+
The command.
|
|
693
|
+
|
|
694
|
+
Raises:
|
|
695
|
+
UnSupportedError: The connection's database can't be opened by another program.
|
|
696
|
+
"""
|
|
697
|
+
return None
|
|
698
|
+
|
|
699
|
+
async def renew_password(self) -> None:
|
|
700
|
+
"""Asks ``password_provider`` for a new password after the server refused the last one, and
|
|
701
|
+
opens the new connections with it (``apply_password()``)."""
|
|
702
|
+
provider = self.password_provider
|
|
703
|
+
if provider is not None:
|
|
704
|
+
self.apply_password(await provider.fetch(provider.password))
|
|
705
|
+
|
|
706
|
+
def get_address(self) -> str:
|
|
707
|
+
"""The server's address for reports (``ConnectionFailed``) - ``host:port``, a file; empty for
|
|
708
|
+
a client that names none.
|
|
709
|
+
|
|
710
|
+
Returns:
|
|
711
|
+
The address.
|
|
712
|
+
"""
|
|
713
|
+
return ""
|
|
714
|
+
|
|
715
|
+
def get_pool_occupancy(self) -> tuple[int, int, int, int, int] | None:
|
|
716
|
+
"""How the client's pool is taken - for ``get_pool_status()`` of a client with
|
|
717
|
+
``Features.supports_pool_status``.
|
|
718
|
+
|
|
719
|
+
Returns:
|
|
720
|
+
The open, the idle and the waited-for connections, the pool's least and most size; None
|
|
721
|
+
while the pool isn't open.
|
|
722
|
+
"""
|
|
723
|
+
raise NotImplementedError()
|
|
724
|
+
|
|
725
|
+
def get_pool_bounds(self) -> tuple[int, int]:
|
|
726
|
+
"""The least and the most connections the client's pool keeps, as configured - for
|
|
727
|
+
``get_pool_status()`` of a pool failing to open.
|
|
728
|
+
|
|
729
|
+
Returns:
|
|
730
|
+
The bounds.
|
|
731
|
+
"""
|
|
732
|
+
raise NotImplementedError()
|
|
733
|
+
|
|
734
|
+
async def get_server_version(self) -> tuple[int, ...] | None:
|
|
735
|
+
"""Returns the version of the server the just-opened connection talks to, without going
|
|
736
|
+
through query instrumentation.
|
|
737
|
+
|
|
738
|
+
Returns:
|
|
739
|
+
The version as ``(major, minor, ...)``, None when the driver doesn't know it - the
|
|
740
|
+
version is then neither checked nor used to decide features.
|
|
741
|
+
"""
|
|
742
|
+
return None
|
|
743
|
+
|
|
744
|
+
async def create_connection(self, with_db: bool) -> None:
|
|
745
|
+
"""
|
|
746
|
+
Establish a DB connection.
|
|
747
|
+
|
|
748
|
+
Args:
|
|
749
|
+
with_db: If True, then select the DB to use, else use default.
|
|
750
|
+
Use case for this is to create/drop a database.
|
|
751
|
+
"""
|
|
752
|
+
raise NotImplementedError()
|
|
753
|
+
|
|
754
|
+
async def _pool_acquire(self) -> Any:
|
|
755
|
+
"""
|
|
756
|
+
Checks out one connection from the pool (PoolConnectionWrapper, a transaction's
|
|
757
|
+
``_take_transaction_resources()``) - only meaningful for a pooled client; a client of one
|
|
758
|
+
connection never calls this.
|
|
759
|
+
"""
|
|
760
|
+
raise NotImplementedError()
|
|
761
|
+
|
|
762
|
+
async def acquire_from_open_pool(self) -> tuple[Any, Any]:
|
|
763
|
+
"""Checks out one connection of the pool - with the pool it came from.
|
|
764
|
+
|
|
765
|
+
Returns:
|
|
766
|
+
The pool and the connection.
|
|
767
|
+
"""
|
|
768
|
+
return self._pool, await self._pool_acquire()
|
|
769
|
+
|
|
770
|
+
async def _pool_release(self, pool: Any, connection: Any) -> None:
|
|
771
|
+
"""Hands a connection checked out by ``_pool_acquire()`` back to the pool it came from -
|
|
772
|
+
which may no longer be ``self._pool`` once the client was closed meanwhile.
|
|
773
|
+
|
|
774
|
+
Args:
|
|
775
|
+
pool: The pool the connection was acquired from.
|
|
776
|
+
connection: The connection to hand back.
|
|
777
|
+
"""
|
|
778
|
+
await pool.release(connection)
|
|
779
|
+
|
|
780
|
+
async def close(self) -> None:
|
|
781
|
+
"""
|
|
782
|
+
Closes the DB connection.
|
|
783
|
+
"""
|
|
784
|
+
raise NotImplementedError()
|
|
785
|
+
|
|
786
|
+
async def db_create(self) -> None:
|
|
787
|
+
"""Creates the database on the server - for the test runner. Needs
|
|
788
|
+
``create_connection(with_db=False)`` first.
|
|
789
|
+
"""
|
|
790
|
+
raise NotImplementedError()
|
|
791
|
+
|
|
792
|
+
async def db_delete(self) -> None:
|
|
793
|
+
"""Drops the database on the server - for the test runner. Needs
|
|
794
|
+
``create_connection(with_db=False)`` first.
|
|
795
|
+
"""
|
|
796
|
+
raise NotImplementedError()
|
|
797
|
+
|
|
798
|
+
def acquire_connection(self) -> ConnectionWrapper[Any] | PoolConnectionWrapper[Any]:
|
|
799
|
+
"""
|
|
800
|
+
Acquires a connection from the pool.
|
|
801
|
+
Will return the current context connection if already in a transaction.
|
|
802
|
+
"""
|
|
803
|
+
raise NotImplementedError()
|
|
804
|
+
|
|
805
|
+
@classmethod
|
|
806
|
+
def get_driver(cls) -> Driver:
|
|
807
|
+
"""Returns the driver the client class belongs to."""
|
|
808
|
+
return DialectRegistry.get_driver(cls.driver_name)
|
|
809
|
+
|
|
810
|
+
@classmethod
|
|
811
|
+
def _get_operational_error(cls, error: BaseException, **context: Any) -> OperationalError:
|
|
812
|
+
"""Returns the hare exception for a statement the database refused to run.
|
|
813
|
+
|
|
814
|
+
Args:
|
|
815
|
+
error: The driver's exception.
|
|
816
|
+
**context: The failed statement's ``sql``/``params``, where known.
|
|
817
|
+
|
|
818
|
+
Returns:
|
|
819
|
+
TransactionRetryError where the driver says running the transaction again can
|
|
820
|
+
succeed (``Driver.is_retryable``), OperationalError otherwise.
|
|
821
|
+
"""
|
|
822
|
+
error_class = TransactionRetryError if cls.get_driver().is_retryable(error) else OperationalError
|
|
823
|
+
return error_class(error, **context)
|
|
824
|
+
|
|
825
|
+
def _in_transaction(self, options: TransactionOptions = TransactionOptions.DEFAULT) -> TransactionContext:
|
|
826
|
+
"""Opens a transaction context on this client - the one hare's own multi-statement writes
|
|
827
|
+
(a cascade, a many-to-many ``add()``, a ``bulk_create()`` in batches) run in.
|
|
828
|
+
|
|
829
|
+
On a database without transactions (``Features.supports_transactions`` False) the block's
|
|
830
|
+
statements run one by one, each applied at once (``NonTransactionalContext``).
|
|
831
|
+
|
|
832
|
+
Args:
|
|
833
|
+
options: How the transaction runs - read-only, statement timeout, isolation level.
|
|
834
|
+
|
|
835
|
+
Returns:
|
|
836
|
+
The context.
|
|
837
|
+
"""
|
|
838
|
+
if not self.features.supports_transactions:
|
|
839
|
+
return NonTransactionalContext(self)
|
|
840
|
+
return self._begin_transaction(options)
|
|
841
|
+
|
|
842
|
+
def _begin_transaction(self, options: TransactionOptions) -> TransactionContext:
|
|
843
|
+
"""Opens a transaction context on a database that has transactions.
|
|
844
|
+
|
|
845
|
+
Args:
|
|
846
|
+
options: How the transaction runs - read-only, statement timeout, isolation level.
|
|
847
|
+
|
|
848
|
+
Returns:
|
|
849
|
+
The context.
|
|
850
|
+
"""
|
|
851
|
+
client = self._get_transaction_client()
|
|
852
|
+
client._set_transaction_options(options)
|
|
853
|
+
return TopLevelTransactionContext(client)
|
|
854
|
+
|
|
855
|
+
def _get_transaction_client(self) -> TransactionClient:
|
|
856
|
+
"""The driver's client of a top-level transaction opened on this client."""
|
|
857
|
+
raise NotImplementedError()
|
|
858
|
+
|
|
859
|
+
def _get_transaction_restriction_statements(self, options: TransactionOptions) -> list[str]:
|
|
860
|
+
"""Returns the statements that make a freshly begun transaction run at its isolation level
|
|
861
|
+
- the dialect's own level for it - read-only and time-limited, from the dialect's
|
|
862
|
+
``TransactionStatements``. The isolation statement comes first: it must precede every query
|
|
863
|
+
of the transaction. A statement-time-limited transaction is also lock-time-limited, so a
|
|
864
|
+
statement waiting on a lock is cancelled as well.
|
|
865
|
+
|
|
866
|
+
Args:
|
|
867
|
+
options: The transaction's options.
|
|
868
|
+
|
|
869
|
+
Returns:
|
|
870
|
+
The statements to run right after BEGIN, in order.
|
|
871
|
+
|
|
872
|
+
Raises:
|
|
873
|
+
UnSupportedError: A restriction is asked for that the dialect has no statement for and
|
|
874
|
+
this client doesn't enforce itself.
|
|
875
|
+
"""
|
|
876
|
+
transactions = self.dialect.transactions
|
|
877
|
+
statements: list[str] = []
|
|
878
|
+
if options.isolation is not None:
|
|
879
|
+
isolation_sql = transactions.get_isolation_level_sql(transactions.get_isolation_level(options.isolation))
|
|
880
|
+
if isolation_sql is not None:
|
|
881
|
+
statements.append(isolation_sql)
|
|
882
|
+
if options.read_only:
|
|
883
|
+
read_only_sql = transactions.get_read_only_sql()
|
|
884
|
+
if read_only_sql is None:
|
|
885
|
+
raise UnSupportedError(f"{self.dialect.name} has no support for read-only transactions")
|
|
886
|
+
statements.append(read_only_sql)
|
|
887
|
+
if (statement_timeout := options.statement_timeout) is not None:
|
|
888
|
+
milliseconds = max(1, round(statement_timeout * 1000))
|
|
889
|
+
statement_timeout_sql = transactions.get_statement_timeout_sql(milliseconds)
|
|
890
|
+
if statement_timeout_sql is not None:
|
|
891
|
+
statements.append(statement_timeout_sql)
|
|
892
|
+
lock_timeout_sql = transactions.get_lock_timeout_sql(milliseconds)
|
|
893
|
+
if lock_timeout_sql is not None and options.lock_timeout is None:
|
|
894
|
+
statements.append(lock_timeout_sql)
|
|
895
|
+
elif not self.enforces_statement_timeout_itself:
|
|
896
|
+
raise UnSupportedError(f"{self.dialect.name} has no support for statement-timeout transactions")
|
|
897
|
+
if (lock_timeout := options.lock_timeout) is not None:
|
|
898
|
+
lock_timeout_sql = transactions.get_lock_timeout_sql(max(1, round(lock_timeout * 1000)))
|
|
899
|
+
if lock_timeout_sql is not None:
|
|
900
|
+
statements.append(lock_timeout_sql)
|
|
901
|
+
elif not self.enforces_lock_timeout_itself:
|
|
902
|
+
raise UnSupportedError(f"{self.dialect.name} has no support for lock-timeout transactions")
|
|
903
|
+
return statements
|
|
904
|
+
|
|
905
|
+
def lock_timeout_session(self, seconds: float) -> AbstractAsyncContextManager[DatabaseClient]:
|
|
906
|
+
"""A client on one connection whose every statement, in a transaction or not, waits at most
|
|
907
|
+
``seconds`` for a lock another session holds - for a migration running outside a
|
|
908
|
+
transaction.
|
|
909
|
+
|
|
910
|
+
Args:
|
|
911
|
+
seconds: The lock timeout.
|
|
912
|
+
|
|
913
|
+
Returns:
|
|
914
|
+
The context giving the client.
|
|
915
|
+
|
|
916
|
+
Raises:
|
|
917
|
+
UnSupportedError: The database has no lock timeout outside a transaction - by default.
|
|
918
|
+
"""
|
|
919
|
+
raise UnSupportedError(f"{self.dialect.name} has no lock timeout outside a transaction")
|
|
920
|
+
|
|
921
|
+
#: Turns one row of ``execute()`` into a dict - a driver whose rows have a faster way sets it.
|
|
922
|
+
row_to_dict: Callable[[Any], dict[str, Any]] = dict
|
|
923
|
+
|
|
924
|
+
async def execute(
|
|
925
|
+
self,
|
|
926
|
+
query: str,
|
|
927
|
+
values: list[Any] | None = None,
|
|
928
|
+
*,
|
|
929
|
+
returns_rows: bool | None = None,
|
|
930
|
+
rows_by_position: bool = False,
|
|
931
|
+
) -> StatementResult:
|
|
932
|
+
"""Executes one SQL statement.
|
|
933
|
+
|
|
934
|
+
Args:
|
|
935
|
+
query: The SQL string, pre-parametrized for the target DB dialect.
|
|
936
|
+
values: A sequence of positional DB parameters.
|
|
937
|
+
returns_rows: Whether the statement returns rows - True for a SELECT or a write with
|
|
938
|
+
``RETURNING``, False for any other write. None lets the driver find out from the
|
|
939
|
+
SQL text; a caller that knows spares that.
|
|
940
|
+
rows_by_position: The caller reads the rows by position alone, their column names from
|
|
941
|
+
``StatementResult.column_names`` - a driver whose rows read by name cost more may
|
|
942
|
+
then give plain tuples (``Features.supports_positional_rows``).
|
|
943
|
+
|
|
944
|
+
Returns:
|
|
945
|
+
The affected or returned row count, and the rows.
|
|
946
|
+
"""
|
|
947
|
+
raise NotImplementedError()
|
|
948
|
+
|
|
949
|
+
async def execute_described(self, query: str, values: list[Any] | None = None) -> DescribedResult:
|
|
950
|
+
"""Executes a raw SQL statement and returns what it returned with the names of its
|
|
951
|
+
columns - known for an empty result too - and the rows it changed: for showing a query's
|
|
952
|
+
result as a table (an SQL console). The rows are tuples in the order of the columns.
|
|
953
|
+
|
|
954
|
+
Args:
|
|
955
|
+
query: The SQL string, pre-parametrized for the target DB dialect.
|
|
956
|
+
values: A sequence of positional DB parameters.
|
|
957
|
+
|
|
958
|
+
Returns:
|
|
959
|
+
The columns, the rows and the row count.
|
|
960
|
+
"""
|
|
961
|
+
raise NotImplementedError()
|
|
962
|
+
|
|
963
|
+
async def execute_dicts(self, query: str, values: list[Any] | None = None) -> list[dict[str, Any]]:
|
|
964
|
+
"""Executes a statement that returns rows, and returns them as dicts.
|
|
965
|
+
|
|
966
|
+
Args:
|
|
967
|
+
query: The SQL string, pre-parametrized for the target DB dialect.
|
|
968
|
+
values: A sequence of positional DB parameters.
|
|
969
|
+
|
|
970
|
+
Returns:
|
|
971
|
+
The rows.
|
|
972
|
+
"""
|
|
973
|
+
return list(map(self.row_to_dict, (await self.execute(query, values, returns_rows=True)).rows))
|
|
974
|
+
|
|
975
|
+
async def execute_script(self, query: str) -> None:
|
|
976
|
+
"""
|
|
977
|
+
Executes a RAW SQL script with multiple statements, and returns nothing.
|
|
978
|
+
|
|
979
|
+
Args:
|
|
980
|
+
query: The SQL string, which will be passed on verbatim.
|
|
981
|
+
Semicolons is supported here.
|
|
982
|
+
"""
|
|
983
|
+
raise NotImplementedError()
|
|
984
|
+
|
|
985
|
+
async def execute_built_script(self, query: str) -> None:
|
|
986
|
+
"""Executes a script hare built - its schema statements - as the connection runs them;
|
|
987
|
+
``execute_script()`` by default. A script the user wrote goes to ``execute_script()``.
|
|
988
|
+
|
|
989
|
+
Args:
|
|
990
|
+
query: The script.
|
|
991
|
+
"""
|
|
992
|
+
await self.execute_script(query)
|
|
993
|
+
|
|
994
|
+
async def stream_batches(
|
|
995
|
+
self, query: str, values: list[Any] | None = None, chunk_size: int = 0
|
|
996
|
+
) -> AsyncGenerator[list[Any]]:
|
|
997
|
+
"""Runs ``query`` on a server-side cursor, yielding the raw rows a batch at a time as they
|
|
998
|
+
arrive. Appends the query tags, runs the query wrappers around the whole iteration and
|
|
999
|
+
reports one ``QueryExecuted`` once the stream is read to the end or closed.
|
|
1000
|
+
|
|
1001
|
+
Args:
|
|
1002
|
+
query: The SQL.
|
|
1003
|
+
values: The bound values.
|
|
1004
|
+
chunk_size: How many rows a batch holds - the driver's own default when 0.
|
|
1005
|
+
"""
|
|
1006
|
+
query = QueryTags.append(query, self.dialect)
|
|
1007
|
+
start = time.perf_counter()
|
|
1008
|
+
error: Exception | None = None
|
|
1009
|
+
if Observers.query_wrappers:
|
|
1010
|
+
call = QueryCall("stream", query, values, self.connection_alias, self.dialect)
|
|
1011
|
+
batches = Observers.stream_wrapped(call, lambda: self._driver_stream_batches(query, values, chunk_size))
|
|
1012
|
+
else:
|
|
1013
|
+
batches = self._driver_stream_batches(query, values, chunk_size)
|
|
1014
|
+
try:
|
|
1015
|
+
async for batch in batches:
|
|
1016
|
+
yield batch
|
|
1017
|
+
except Exception as raised_error:
|
|
1018
|
+
error = raised_error
|
|
1019
|
+
raise
|
|
1020
|
+
finally:
|
|
1021
|
+
try:
|
|
1022
|
+
if (close_batches := getattr(batches, "aclose", None)) is not None:
|
|
1023
|
+
await close_batches()
|
|
1024
|
+
finally:
|
|
1025
|
+
Observers.record_query(query, values, start, error, self.connection_alias)
|
|
1026
|
+
|
|
1027
|
+
async def stream(self, query: str, values: list[Any] | None = None, chunk_size: int = 0) -> AsyncGenerator[Any]:
|
|
1028
|
+
"""``stream_batches()`` a row at a time - reading a row after the stream's transaction ended
|
|
1029
|
+
raises.
|
|
1030
|
+
|
|
1031
|
+
Args:
|
|
1032
|
+
query: The SQL.
|
|
1033
|
+
values: The bound values.
|
|
1034
|
+
chunk_size: How many rows to fetch per round trip - the driver's own default when 0.
|
|
1035
|
+
"""
|
|
1036
|
+
async with contextlib.aclosing(self.stream_batches(query, values, chunk_size)) as batches:
|
|
1037
|
+
async for batch in batches:
|
|
1038
|
+
for row in batch:
|
|
1039
|
+
self.check_stream_open()
|
|
1040
|
+
yield row
|
|
1041
|
+
|
|
1042
|
+
def check_stream_open(self) -> None:
|
|
1043
|
+
"""Refuses to hand out a streamed row the connection no longer reads - nothing by default: a
|
|
1044
|
+
stream outside a transaction is read to its end or closed.
|
|
1045
|
+
|
|
1046
|
+
Raises:
|
|
1047
|
+
TransactionManagementError: The transaction the stream belongs to ended.
|
|
1048
|
+
"""
|
|
1049
|
+
|
|
1050
|
+
async def _driver_stream_batches(
|
|
1051
|
+
self, query: str, values: list[Any] | None = None, chunk_size: int = 0
|
|
1052
|
+
) -> AsyncGenerator[list[Any]]:
|
|
1053
|
+
"""The driver's server-side cursor behind ``stream_batches()`` - implemented by a driver that
|
|
1054
|
+
supports streaming.
|
|
1055
|
+
|
|
1056
|
+
Args:
|
|
1057
|
+
query: The tagged SQL.
|
|
1058
|
+
values: The bound values.
|
|
1059
|
+
chunk_size: How many rows a batch holds - the driver's own default when 0.
|
|
1060
|
+
"""
|
|
1061
|
+
raise UnSupportedError(f"{self.dialect.name} has no server-side streaming support")
|
|
1062
|
+
yield # type: ignore[unreachable]
|
|
1063
|
+
|
|
1064
|
+
async def take_generated_keys(self, model: type[Model], count: int) -> list[Any]:
|
|
1065
|
+
"""Takes the next keys of a model's series - of a database handing them out before the rows
|
|
1066
|
+
are written (``Features.takes_keys_before_insert``).
|
|
1067
|
+
|
|
1068
|
+
Args:
|
|
1069
|
+
model: The model.
|
|
1070
|
+
count: How many keys.
|
|
1071
|
+
|
|
1072
|
+
Returns:
|
|
1073
|
+
The keys, each never handed out again.
|
|
1074
|
+
|
|
1075
|
+
Raises:
|
|
1076
|
+
UnSupportedError: The database generates keys as it writes the rows.
|
|
1077
|
+
"""
|
|
1078
|
+
raise UnSupportedError(f"The {self.dialect} database generates keys as it writes the rows")
|
|
1079
|
+
|
|
1080
|
+
async def synchronize_key_series(self, model: type[Model]) -> None:
|
|
1081
|
+
"""Moves a model's series of keys past the greatest key its table holds - rows written with
|
|
1082
|
+
keys of their own leave the series behind. Nothing by default: a database generating keys as
|
|
1083
|
+
it writes the rows keeps up by itself.
|
|
1084
|
+
|
|
1085
|
+
Args:
|
|
1086
|
+
model: The model.
|
|
1087
|
+
"""
|
|
1088
|
+
|
|
1089
|
+
async def execute_many(self, query: str, values: list[list[Any]]) -> None:
|
|
1090
|
+
"""
|
|
1091
|
+
Executes one statement once per parameter row, and returns no data.
|
|
1092
|
+
|
|
1093
|
+
Args:
|
|
1094
|
+
query: The SQL string, pre-parametrized for the target DB dialect.
|
|
1095
|
+
values: A sequence of positional DB parameters.
|
|
1096
|
+
"""
|
|
1097
|
+
raise NotImplementedError()
|
|
1098
|
+
|
|
1099
|
+
async def copy(
|
|
1100
|
+
self,
|
|
1101
|
+
table: str,
|
|
1102
|
+
columns: list[str],
|
|
1103
|
+
records: list[tuple[Any, ...]],
|
|
1104
|
+
column_types: list[str],
|
|
1105
|
+
schema: str | None = None,
|
|
1106
|
+
) -> None:
|
|
1107
|
+
"""
|
|
1108
|
+
Bulk-loads rows into a table through a driver-native bulk-load protocol, bypassing
|
|
1109
|
+
parameterized INSERT entirely - no ON CONFLICT/RETURNING support.
|
|
1110
|
+
|
|
1111
|
+
Args:
|
|
1112
|
+
table: The bare (unquoted) table name to load into.
|
|
1113
|
+
columns: The DB column names to load, in the same order as each record's values.
|
|
1114
|
+
records: One tuple of already DB-ready values per row.
|
|
1115
|
+
column_types: Each column's type as the dialect names it for a bulk load
|
|
1116
|
+
(``SqlParameters.get_copy_column_type()``), same order as ``columns`` - needed by
|
|
1117
|
+
a driver whose bulk-load protocol has no per-value type negotiation of its own.
|
|
1118
|
+
schema: The table's schema (``Meta.schema``) - None for the connection's default one.
|
|
1119
|
+
"""
|
|
1120
|
+
raise NotImplementedError()
|
|
1121
|
+
|
|
1122
|
+
async def open_across_closes(self) -> bool:
|
|
1123
|
+
"""Opens the connection once (``create_connection()``), telling whether a close ran meanwhile
|
|
1124
|
+
(``Connections.reconnect()``) - then what opened belongs to no client: the caller closes it and
|
|
1125
|
+
opens anew.
|
|
1126
|
+
|
|
1127
|
+
Returns:
|
|
1128
|
+
Whether a close ran while it opened.
|
|
1129
|
+
|
|
1130
|
+
Raises:
|
|
1131
|
+
Exception: What the opening raised, unless a close ran meanwhile - its setup then broke on
|
|
1132
|
+
what the close took.
|
|
1133
|
+
"""
|
|
1134
|
+
closes_before = self.closes_started
|
|
1135
|
+
self.opening_task = asyncio.current_task()
|
|
1136
|
+
try:
|
|
1137
|
+
await self.create_connection(with_db=True)
|
|
1138
|
+
except Exception:
|
|
1139
|
+
if self.closes_started == closes_before:
|
|
1140
|
+
raise
|
|
1141
|
+
finally:
|
|
1142
|
+
self.opening_task = None
|
|
1143
|
+
return self.closes_started != closes_before
|
|
1144
|
+
|
|
1145
|
+
def get_schema_sql(self, safe: bool) -> str:
|
|
1146
|
+
"""The DDL creating every model of this connection.
|
|
1147
|
+
|
|
1148
|
+
Args:
|
|
1149
|
+
safe: Whether each object is created only when it doesn't exist yet.
|
|
1150
|
+
|
|
1151
|
+
Returns:
|
|
1152
|
+
The DDL script.
|
|
1153
|
+
"""
|
|
1154
|
+
return self.dialect.schema_editor_class(self).table_creation.get_create_schema_sql(safe)
|
|
1155
|
+
|
|
1156
|
+
async def generate_schema(self, safe: bool) -> None:
|
|
1157
|
+
"""Creates every model of this connection in the database.
|
|
1158
|
+
|
|
1159
|
+
Args:
|
|
1160
|
+
safe: Whether each object is created only when it doesn't exist yet.
|
|
1161
|
+
"""
|
|
1162
|
+
# Connected first, so the DDL is written for the features of the server's own version.
|
|
1163
|
+
async with self.acquire_connection():
|
|
1164
|
+
pass
|
|
1165
|
+
schema = self.get_schema_sql(safe)
|
|
1166
|
+
self.log.debug("Creating schema: %s", schema)
|
|
1167
|
+
if schema:
|
|
1168
|
+
await self.execute_built_script(schema)
|
|
1169
|
+
|
|
1170
|
+
async def ping(self, timeout: float = PING_TIMEOUT_SECONDS) -> bool:
|
|
1171
|
+
"""Runs ``SELECT 1`` and reports whether the connection is usable. Only
|
|
1172
|
+
``DBConnectionError``/``OperationalError``/``TimeoutError`` mean unhealthy - a programming
|
|
1173
|
+
error still propagates. The timeout is enforced here: a server that stopped answering
|
|
1174
|
+
without closing the socket never makes a driver raise.
|
|
1175
|
+
|
|
1176
|
+
Args:
|
|
1177
|
+
timeout: Seconds to wait before reporting unhealthy - above 0, at most
|
|
1178
|
+
``MAX_PING_TIMEOUT_SECONDS``.
|
|
1179
|
+
|
|
1180
|
+
Returns:
|
|
1181
|
+
True if the query succeeded.
|
|
1182
|
+
|
|
1183
|
+
Raises:
|
|
1184
|
+
TypeError: ``timeout`` isn't a number.
|
|
1185
|
+
ValueError: ``timeout`` is out of range.
|
|
1186
|
+
"""
|
|
1187
|
+
return (await ConnectionPing.run(self, timeout)).succeeded
|