singlestoredb 0.4.0__py3-none-any.whl → 1.0.4__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.
Potentially problematic release.
This version of singlestoredb might be problematic. Click here for more details.
- singlestoredb/__init__.py +33 -1
- singlestoredb/alchemy/__init__.py +90 -0
- singlestoredb/auth.py +5 -1
- singlestoredb/config.py +116 -14
- singlestoredb/connection.py +483 -516
- singlestoredb/converters.py +238 -135
- singlestoredb/exceptions.py +30 -2
- singlestoredb/functions/__init__.py +1 -0
- singlestoredb/functions/decorator.py +142 -0
- singlestoredb/functions/dtypes.py +1639 -0
- singlestoredb/functions/ext/__init__.py +2 -0
- singlestoredb/functions/ext/arrow.py +375 -0
- singlestoredb/functions/ext/asgi.py +661 -0
- singlestoredb/functions/ext/json.py +427 -0
- singlestoredb/functions/ext/mmap.py +306 -0
- singlestoredb/functions/ext/rowdat_1.py +744 -0
- singlestoredb/functions/signature.py +673 -0
- singlestoredb/fusion/__init__.py +11 -0
- singlestoredb/fusion/graphql.py +213 -0
- singlestoredb/fusion/handler.py +621 -0
- singlestoredb/fusion/handlers/stage.py +257 -0
- singlestoredb/fusion/handlers/utils.py +162 -0
- singlestoredb/fusion/handlers/workspace.py +412 -0
- singlestoredb/fusion/registry.py +164 -0
- singlestoredb/fusion/result.py +399 -0
- singlestoredb/http/__init__.py +27 -0
- singlestoredb/{http.py → http/connection.py} +555 -154
- singlestoredb/management/__init__.py +3 -0
- singlestoredb/management/billing_usage.py +148 -0
- singlestoredb/management/cluster.py +14 -6
- singlestoredb/management/manager.py +100 -38
- singlestoredb/management/organization.py +188 -0
- singlestoredb/management/region.py +5 -5
- singlestoredb/management/utils.py +281 -2
- singlestoredb/management/workspace.py +1344 -49
- singlestoredb/{clients/pymysqlsv → mysql}/__init__.py +16 -21
- singlestoredb/{clients/pymysqlsv → mysql}/_auth.py +39 -8
- singlestoredb/{clients/pymysqlsv → mysql}/charset.py +26 -23
- singlestoredb/{clients/pymysqlsv/connections.py → mysql/connection.py} +532 -165
- singlestoredb/{clients/pymysqlsv → mysql}/constants/CLIENT.py +0 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/COMMAND.py +0 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/CR.py +0 -2
- singlestoredb/{clients/pymysqlsv → mysql}/constants/ER.py +0 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/FIELD_TYPE.py +1 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/FLAG.py +0 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/SERVER_STATUS.py +0 -1
- singlestoredb/mysql/converters.py +271 -0
- singlestoredb/{clients/pymysqlsv → mysql}/cursors.py +228 -112
- singlestoredb/mysql/err.py +92 -0
- singlestoredb/{clients/pymysqlsv → mysql}/optionfile.py +5 -4
- singlestoredb/{clients/pymysqlsv → mysql}/protocol.py +49 -20
- singlestoredb/mysql/tests/__init__.py +19 -0
- singlestoredb/{clients/pymysqlsv → mysql}/tests/base.py +32 -12
- singlestoredb/mysql/tests/conftest.py +37 -0
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_DictCursor.py +11 -7
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_SSCursor.py +17 -12
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_basic.py +32 -24
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_connection.py +130 -119
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_converters.py +9 -7
- singlestoredb/mysql/tests/test_cursor.py +141 -0
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_err.py +3 -2
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_issues.py +35 -27
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_load_local.py +13 -11
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_nextset.py +7 -3
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_optionfile.py +2 -1
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/__init__.py +1 -1
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/capabilities.py +19 -17
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/dbapi20.py +31 -22
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +3 -4
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +24 -20
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +4 -4
- singlestoredb/{clients/pymysqlsv → mysql}/times.py +3 -4
- singlestoredb/pytest.py +283 -0
- singlestoredb/tests/empty.sql +0 -0
- singlestoredb/tests/ext_funcs/__init__.py +385 -0
- singlestoredb/tests/test.sql +210 -0
- singlestoredb/tests/test2.sql +1 -0
- singlestoredb/tests/test_basics.py +482 -115
- singlestoredb/tests/test_config.py +13 -13
- singlestoredb/tests/test_connection.py +241 -305
- singlestoredb/tests/test_dbapi.py +27 -0
- singlestoredb/tests/test_ext_func.py +1193 -0
- singlestoredb/tests/test_ext_func_data.py +1101 -0
- singlestoredb/tests/test_fusion.py +465 -0
- singlestoredb/tests/test_http.py +32 -26
- singlestoredb/tests/test_management.py +588 -8
- singlestoredb/tests/test_plugin.py +33 -0
- singlestoredb/tests/test_results.py +11 -12
- singlestoredb/tests/test_udf.py +687 -0
- singlestoredb/tests/utils.py +3 -2
- singlestoredb/utils/config.py +58 -0
- singlestoredb/utils/debug.py +13 -0
- singlestoredb/utils/mogrify.py +151 -0
- singlestoredb/utils/results.py +4 -1
- singlestoredb-1.0.4.dist-info/METADATA +139 -0
- singlestoredb-1.0.4.dist-info/RECORD +112 -0
- {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/WHEEL +1 -1
- singlestoredb-1.0.4.dist-info/entry_points.txt +2 -0
- singlestoredb/clients/pymysqlsv/converters.py +0 -365
- singlestoredb/clients/pymysqlsv/err.py +0 -144
- singlestoredb/clients/pymysqlsv/tests/__init__.py +0 -19
- singlestoredb/clients/pymysqlsv/tests/test_cursor.py +0 -133
- singlestoredb/clients/pymysqlsv/tests/thirdparty/test_MySQLdb/__init__.py +0 -9
- singlestoredb/drivers/__init__.py +0 -45
- singlestoredb/drivers/base.py +0 -198
- singlestoredb/drivers/cymysql.py +0 -38
- singlestoredb/drivers/http.py +0 -47
- singlestoredb/drivers/mariadb.py +0 -40
- singlestoredb/drivers/mysqlconnector.py +0 -49
- singlestoredb/drivers/mysqldb.py +0 -60
- singlestoredb/drivers/pymysql.py +0 -37
- singlestoredb/drivers/pymysqlsv.py +0 -35
- singlestoredb/drivers/pyodbc.py +0 -65
- singlestoredb-0.4.0.dist-info/METADATA +0 -111
- singlestoredb-0.4.0.dist-info/RECORD +0 -86
- /singlestoredb/{clients → fusion/handlers}/__init__.py +0 -0
- /singlestoredb/{clients/pymysqlsv → mysql}/constants/__init__.py +0 -0
- {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/LICENSE +0 -0
- {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/top_level.txt +0 -0
singlestoredb/tests/utils.py
CHANGED
|
@@ -86,11 +86,12 @@ def load_sql(sql_file: str) -> str:
|
|
|
86
86
|
if cmd:
|
|
87
87
|
cmd += ';'
|
|
88
88
|
cur.execute(cmd)
|
|
89
|
-
|
|
89
|
+
|
|
90
|
+
elif not conn.driver.startswith('http'):
|
|
90
91
|
cur.execute(f'USE {dbname};')
|
|
91
92
|
|
|
92
93
|
# Start HTTP server as needed.
|
|
93
|
-
if http_port:
|
|
94
|
+
if http_port and not conn.driver.startswith('http'):
|
|
94
95
|
cur.execute(f'SET GLOBAL HTTP_PROXY_PORT={http_port};')
|
|
95
96
|
cur.execute('SET GLOBAL HTTP_API=ON;')
|
|
96
97
|
cur.execute('RESTART PROXY;')
|
singlestoredb/utils/config.py
CHANGED
|
@@ -32,6 +32,7 @@ from typing import Callable
|
|
|
32
32
|
from typing import Dict
|
|
33
33
|
from typing import Iterator
|
|
34
34
|
from typing import List
|
|
35
|
+
from typing import Mapping
|
|
35
36
|
from typing import Optional
|
|
36
37
|
from typing import Tuple
|
|
37
38
|
from typing import Union
|
|
@@ -562,6 +563,28 @@ def check_bool(value: Union[bool, int]) -> bool:
|
|
|
562
563
|
raise ValueError('%s is not a recognized bool value')
|
|
563
564
|
|
|
564
565
|
|
|
566
|
+
def check_optional_bool(value: Optional[Union[bool, int]]) -> Optional[bool]:
|
|
567
|
+
"""
|
|
568
|
+
Validate an optional bool value.
|
|
569
|
+
|
|
570
|
+
Parameters
|
|
571
|
+
----------
|
|
572
|
+
value : int or bool or None
|
|
573
|
+
The value to validate. If specified as an integer, it must
|
|
574
|
+
be either 0 for False or 1 for True.
|
|
575
|
+
|
|
576
|
+
Returns
|
|
577
|
+
-------
|
|
578
|
+
bool
|
|
579
|
+
The validated bool
|
|
580
|
+
|
|
581
|
+
"""
|
|
582
|
+
if value is None:
|
|
583
|
+
return None
|
|
584
|
+
|
|
585
|
+
return check_bool(value)
|
|
586
|
+
|
|
587
|
+
|
|
565
588
|
def check_str(
|
|
566
589
|
value: Any,
|
|
567
590
|
pattern: Optional[str] = None,
|
|
@@ -623,6 +646,41 @@ def check_str(
|
|
|
623
646
|
return out
|
|
624
647
|
|
|
625
648
|
|
|
649
|
+
def check_dict_str_str(
|
|
650
|
+
value: Any,
|
|
651
|
+
) -> Optional[Dict[str, str]]:
|
|
652
|
+
"""
|
|
653
|
+
Validate a string value.
|
|
654
|
+
|
|
655
|
+
Parameters
|
|
656
|
+
----------
|
|
657
|
+
value : dict
|
|
658
|
+
The value to validate. Keys and values must be strings.
|
|
659
|
+
|
|
660
|
+
Returns
|
|
661
|
+
-------
|
|
662
|
+
dict
|
|
663
|
+
The validated dict value
|
|
664
|
+
"""
|
|
665
|
+
if value is None:
|
|
666
|
+
return None
|
|
667
|
+
|
|
668
|
+
if not isinstance(value, Mapping):
|
|
669
|
+
raise ValueError(
|
|
670
|
+
'value {} must be of type dict'.format(value),
|
|
671
|
+
)
|
|
672
|
+
|
|
673
|
+
out = {}
|
|
674
|
+
for k, v in value.items():
|
|
675
|
+
if not isinstance(k, str) or not isinstance(v, str):
|
|
676
|
+
raise ValueError(
|
|
677
|
+
'keys and values in {} must be strings'.format(value),
|
|
678
|
+
)
|
|
679
|
+
out[k] = v
|
|
680
|
+
|
|
681
|
+
return out
|
|
682
|
+
|
|
683
|
+
|
|
626
684
|
def check_url(
|
|
627
685
|
value: str,
|
|
628
686
|
pattern: Optional[str] = None,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from ..config import get_option
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def log_query(query: str, args: Any = None) -> None:
|
|
8
|
+
"""Log the query and parameters."""
|
|
9
|
+
if get_option('debug.queries'):
|
|
10
|
+
if args is None:
|
|
11
|
+
print('[QUERY]', query, file=sys.stderr)
|
|
12
|
+
else:
|
|
13
|
+
print('[QUERY]', query, args, file=sys.stderr)
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
from typing import Any
|
|
3
|
+
from typing import Dict
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from typing import Sequence
|
|
6
|
+
from typing import Union
|
|
7
|
+
|
|
8
|
+
from ..mysql import converters
|
|
9
|
+
from ..mysql.constants import SERVER_STATUS
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
Encoders = converters.Encoders
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def escape(
|
|
16
|
+
obj: Any,
|
|
17
|
+
charset: str = 'utf8',
|
|
18
|
+
mapping: Optional[Encoders] = None,
|
|
19
|
+
server_status: int = 0,
|
|
20
|
+
binary_prefix: bool = False,
|
|
21
|
+
) -> str:
|
|
22
|
+
"""
|
|
23
|
+
Escape whatever value is passed.
|
|
24
|
+
|
|
25
|
+
Non-standard, for internal use; do not use this in your applications.
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
dtype = type(obj)
|
|
29
|
+
if dtype is str or isinstance(obj, str):
|
|
30
|
+
return "'{}'".format(escape_string(obj, server_status=server_status))
|
|
31
|
+
if dtype is bytes or dtype is bytearray or isinstance(obj, (bytes, bytearray)):
|
|
32
|
+
return _quote_bytes(
|
|
33
|
+
obj,
|
|
34
|
+
server_status=server_status,
|
|
35
|
+
binary_prefix=binary_prefix,
|
|
36
|
+
)
|
|
37
|
+
if mapping is None:
|
|
38
|
+
mapping = converters.encoders
|
|
39
|
+
return converters.escape_item(obj, charset, mapping=mapping)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def literal(
|
|
43
|
+
obj: Any,
|
|
44
|
+
charset: str = 'utf8',
|
|
45
|
+
encoders: Optional[Encoders] = None,
|
|
46
|
+
server_status: int = 0,
|
|
47
|
+
binary_prefix: bool = False,
|
|
48
|
+
) -> str:
|
|
49
|
+
"""
|
|
50
|
+
Alias for escape().
|
|
51
|
+
|
|
52
|
+
Non-standard, for internal use; do not use this in your applications.
|
|
53
|
+
|
|
54
|
+
"""
|
|
55
|
+
return escape(
|
|
56
|
+
obj, charset=charset, mapping=encoders,
|
|
57
|
+
server_status=server_status, binary_prefix=binary_prefix,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def escape_string(
|
|
62
|
+
s: str,
|
|
63
|
+
server_status: int = 0,
|
|
64
|
+
) -> str:
|
|
65
|
+
"""Escape a string value."""
|
|
66
|
+
if server_status & SERVER_STATUS.SERVER_STATUS_NO_BACKSLASH_ESCAPES:
|
|
67
|
+
return s.replace("'", "''")
|
|
68
|
+
return converters.escape_string(s)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _quote_bytes(
|
|
72
|
+
s: bytes,
|
|
73
|
+
server_status: int = 0,
|
|
74
|
+
binary_prefix: bool = False,
|
|
75
|
+
) -> str:
|
|
76
|
+
if server_status & SERVER_STATUS.SERVER_STATUS_NO_BACKSLASH_ESCAPES:
|
|
77
|
+
if binary_prefix:
|
|
78
|
+
return "_binary X'{}'".format(s.hex())
|
|
79
|
+
return "X'{}'".format(s.hex())
|
|
80
|
+
return converters.escape_bytes(s)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _escape_args(
|
|
84
|
+
args: Union[Sequence[Any], Dict[str, Any], None],
|
|
85
|
+
charset: str = 'utf8',
|
|
86
|
+
encoders: Optional[Encoders] = None,
|
|
87
|
+
server_status: int = 0,
|
|
88
|
+
binary_prefix: bool = False,
|
|
89
|
+
) -> Any:
|
|
90
|
+
if encoders is None:
|
|
91
|
+
encoders = converters.encoders
|
|
92
|
+
|
|
93
|
+
if isinstance(args, (tuple, list)):
|
|
94
|
+
return tuple(
|
|
95
|
+
literal(
|
|
96
|
+
arg, charset=charset, encoders=encoders,
|
|
97
|
+
server_status=server_status,
|
|
98
|
+
binary_prefix=binary_prefix,
|
|
99
|
+
) for arg in args
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
elif isinstance(args, dict):
|
|
103
|
+
return {
|
|
104
|
+
key: literal(
|
|
105
|
+
val, charset=charset, encoders=encoders,
|
|
106
|
+
server_status=server_status,
|
|
107
|
+
binary_prefix=binary_prefix,
|
|
108
|
+
) for (key, val) in args.items()
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
# If it's not a dictionary let's try escaping it anyways.
|
|
112
|
+
# Worst case it will throw a Value error
|
|
113
|
+
return escape(
|
|
114
|
+
args, charset=charset, mapping=encoders,
|
|
115
|
+
server_status=server_status, binary_prefix=binary_prefix,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def mogrify(
|
|
120
|
+
query: Union[str, bytes],
|
|
121
|
+
args: Union[Sequence[Any], Dict[str, Any], None] = None,
|
|
122
|
+
charset: str = 'utf8',
|
|
123
|
+
encoders: Optional[Encoders] = None,
|
|
124
|
+
server_status: int = 0,
|
|
125
|
+
binary_prefix: bool = False,
|
|
126
|
+
) -> Union[str, bytes]:
|
|
127
|
+
"""
|
|
128
|
+
Returns the exact string sent to the database by calling the execute() method.
|
|
129
|
+
|
|
130
|
+
This method follows the extension to the DB API 2.0 followed by Psycopg.
|
|
131
|
+
|
|
132
|
+
Parameters
|
|
133
|
+
----------
|
|
134
|
+
query : str
|
|
135
|
+
Query to mogrify.
|
|
136
|
+
args : Sequence[Any] or Dict[str, Any] or Any, optional
|
|
137
|
+
Parameters used with query. (optional)
|
|
138
|
+
|
|
139
|
+
Returns
|
|
140
|
+
-------
|
|
141
|
+
str : The query with argument binding applied.
|
|
142
|
+
|
|
143
|
+
"""
|
|
144
|
+
if args:
|
|
145
|
+
query = query % _escape_args(
|
|
146
|
+
args, charset=charset,
|
|
147
|
+
encoders=encoders,
|
|
148
|
+
server_status=server_status,
|
|
149
|
+
binary_prefix=binary_prefix,
|
|
150
|
+
)
|
|
151
|
+
return query
|
singlestoredb/utils/results.py
CHANGED
|
@@ -28,7 +28,7 @@ class Description(NamedTuple):
|
|
|
28
28
|
"""Column definition."""
|
|
29
29
|
|
|
30
30
|
name: str
|
|
31
|
-
type_code:
|
|
31
|
+
type_code: int
|
|
32
32
|
display_size: Optional[int]
|
|
33
33
|
internal_size: Optional[int]
|
|
34
34
|
precision: Optional[int]
|
|
@@ -190,8 +190,11 @@ _converters: Dict[
|
|
|
190
190
|
],
|
|
191
191
|
] = {
|
|
192
192
|
'tuple': results_to_tuple,
|
|
193
|
+
'tuples': results_to_tuple,
|
|
193
194
|
'namedtuple': results_to_namedtuple,
|
|
195
|
+
'namedtuples': results_to_namedtuple,
|
|
194
196
|
'dict': results_to_dict,
|
|
197
|
+
'dicts': results_to_dict,
|
|
195
198
|
'dataframe': results_to_dataframe,
|
|
196
199
|
}
|
|
197
200
|
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: singlestoredb
|
|
3
|
+
Version: 1.0.4
|
|
4
|
+
Summary: Interface to the SingleStoreDB database and workspace management APIs
|
|
5
|
+
Home-page: https://github.com/singlestore-labs/singlestoredb-python
|
|
6
|
+
Author: SingleStore
|
|
7
|
+
Author-email: support@singlestore.com
|
|
8
|
+
License: Apache-2.0
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
13
|
+
Classifier: Topic :: Database
|
|
14
|
+
Requires-Python: >=3.8
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
Requires-Dist: PyJWT
|
|
18
|
+
Requires-Dist: build
|
|
19
|
+
Requires-Dist: parsimonious
|
|
20
|
+
Requires-Dist: requests
|
|
21
|
+
Requires-Dist: setuptools
|
|
22
|
+
Requires-Dist: sqlparams
|
|
23
|
+
Requires-Dist: wheel
|
|
24
|
+
Provides-Extra: dataframe
|
|
25
|
+
Requires-Dist: ibis-singlestoredb ; extra == 'dataframe'
|
|
26
|
+
Provides-Extra: dbt
|
|
27
|
+
Requires-Dist: dbt-singlestore ; extra == 'dbt'
|
|
28
|
+
Provides-Extra: ed22519
|
|
29
|
+
Requires-Dist: PyNaCl >=1.4.0 ; extra == 'ed22519'
|
|
30
|
+
Provides-Extra: gssapi
|
|
31
|
+
Requires-Dist: gssapi ; extra == 'gssapi'
|
|
32
|
+
Provides-Extra: ibis
|
|
33
|
+
Requires-Dist: ibis-singlestoredb ; extra == 'ibis'
|
|
34
|
+
Provides-Extra: kerberos
|
|
35
|
+
Requires-Dist: gssapi ; extra == 'kerberos'
|
|
36
|
+
Provides-Extra: pytest
|
|
37
|
+
Requires-Dist: pytest ; extra == 'pytest'
|
|
38
|
+
Provides-Extra: rsa
|
|
39
|
+
Requires-Dist: cryptography ; extra == 'rsa'
|
|
40
|
+
Provides-Extra: sqlalchemy
|
|
41
|
+
Requires-Dist: sqlalchemy-singlestoredb >=1.0.0 ; extra == 'sqlalchemy'
|
|
42
|
+
|
|
43
|
+
# <img src="https://github.com/singlestore-labs/singlestoredb-python/blob/main/resources/singlestore-logo.png" height="60" valign="middle"/> SingleStoreDB Python SDK
|
|
44
|
+
|
|
45
|
+
This project contains a [DB-API 2.0](https://www.python.org/dev/peps/pep-0249/)
|
|
46
|
+
compatible Python interface to the SingleStore database and workspace management API.
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
This package can be install from PyPI using `pip`:
|
|
51
|
+
```
|
|
52
|
+
pip install singlestoredb
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Documentation
|
|
56
|
+
|
|
57
|
+
https://singlestore-labs.github.io/singlestoredb-python
|
|
58
|
+
|
|
59
|
+
## Usage
|
|
60
|
+
|
|
61
|
+
Connections to the SingleStore database are made using the DB-API parameters
|
|
62
|
+
`host`, `port`, `user`, `password`, etc, but they may also be done using
|
|
63
|
+
URLs that specify these parameters as well (much like the
|
|
64
|
+
[SQLAlchemy](https://www.sqlalchemy.org) package).
|
|
65
|
+
```
|
|
66
|
+
import singlestoredb as s2
|
|
67
|
+
|
|
68
|
+
# Connect using the default connector
|
|
69
|
+
conn = s2.connect('user:password@host:3306/db_name')
|
|
70
|
+
|
|
71
|
+
# Create a cursor
|
|
72
|
+
cur = conn.cursor()
|
|
73
|
+
|
|
74
|
+
# Execute SQL
|
|
75
|
+
cur.execute('select * from foo')
|
|
76
|
+
|
|
77
|
+
# Fetch the results
|
|
78
|
+
print(cur.description)
|
|
79
|
+
for item in cur:
|
|
80
|
+
print(item)
|
|
81
|
+
|
|
82
|
+
# Close the connection
|
|
83
|
+
conn.close()
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Connecting to the HTTP API is done as follows:
|
|
87
|
+
```
|
|
88
|
+
# Use the HTTP API connector
|
|
89
|
+
conn = s2.connect('https://user:password@host:8080/db_name')
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Performance
|
|
93
|
+
|
|
94
|
+
While this package is based on [PyMySQL](https://github.com/PyMySQL/PyMySQL)
|
|
95
|
+
which is a pure Python-based MySQL connector, it adds various performance
|
|
96
|
+
enhancements that make it faster than most other connectors. The performance
|
|
97
|
+
improvements come from changes to the data conversion functions, cursor implementations,
|
|
98
|
+
and a C extension that is highly optimized to improve row data reading.
|
|
99
|
+
|
|
100
|
+
The package can be used both in a pure Python mode and as well as a C accelerated
|
|
101
|
+
mode. Generally speaking, the C accelerated version of the client can read
|
|
102
|
+
data 10X faster than PyMySQL, 2X faster than MySQLdb, and 1.5X faster than
|
|
103
|
+
mysql.connector. All of this is done without having to install any 3rd party
|
|
104
|
+
MySQL libraries!
|
|
105
|
+
|
|
106
|
+
Benchmarking was done with a table of 3,533,286 rows each containing a datetime,
|
|
107
|
+
a float, and eight character columns. The data is the same data set used in
|
|
108
|
+
[this article](https://www.singlestore.com/blog/how-to-get-started-with-singlestore/).
|
|
109
|
+
The client and server were running on the same machine and queries were made
|
|
110
|
+
using `fetchone`, `fetchall`, `fetchmany(1000)`, and an iterator over the cursor
|
|
111
|
+
object (e.g., `iter(cur)`). The results are shown below.
|
|
112
|
+
|
|
113
|
+
### Buffered
|
|
114
|
+
|
|
115
|
+
| | PyMySQL | MySQLdb | mysql.connector | SingleStore (pure Python) | SingleStore |
|
|
116
|
+
|-------------------------|---------|---------|-----------------|---------------------------|-------------|
|
|
117
|
+
| fetchall | 37.0s | 8.7s | 5.6s | 29.0s | 3.7s |
|
|
118
|
+
| fetchmany(1000) | 37.4s | 9.2s | 6.2s | 29.6s | 3.6s |
|
|
119
|
+
| fetchone | 38.2s | 10.1s | 10.2s | 30.9s | 4.8s |
|
|
120
|
+
| iter(cur) | 38.3s | 9.1s | 10.2s | 30.4s | 4.4s |
|
|
121
|
+
|
|
122
|
+
### Unbuffered
|
|
123
|
+
|
|
124
|
+
| | PyMySQL | MySQLdb | mysql.connector | SingleStore (pure Python) | SingleStore |
|
|
125
|
+
|-------------------------|---------|---------|-----------------|---------------------------|-------------|
|
|
126
|
+
| fetchall | 39.0s | 6.5s | 5.5s | 30.3s | 5.5s |
|
|
127
|
+
| fetchmany(1000) | 39.4s | 7.0s | 6.0s | 30.4s | 4.1s |
|
|
128
|
+
| fetchone | 34.5s | 8.9s | 10.1s | 30.8s | 6.6s |
|
|
129
|
+
| iter(cur) | 39.0s | 9.0s | 10.2s | 31.4s | 6.0s |
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
This library is licensed under the [Apache 2.0 License](https://raw.githubusercontent.com/singlestore-labs/singlestoredb-python/main/LICENSE?token=GHSAT0AAAAAABMGV6QPNR6N23BVICDYK5LAYTVK5EA).
|
|
135
|
+
|
|
136
|
+
## Resources
|
|
137
|
+
|
|
138
|
+
* [SingleStore](https://singlestore.com)
|
|
139
|
+
* [Python](https://python.org)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
singlestoredb/__init__.py,sha256=viRBrAKqkgdSWpFXvWnozGcsk0jjaoyLKBQ6xcy4McU,1634
|
|
2
|
+
singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
|
|
3
|
+
singlestoredb/config.py,sha256=Xaipos7C0bLTM2EBsuBXRuA4NI-AL3Attb7KC-DqlSg,7856
|
|
4
|
+
singlestoredb/connection.py,sha256=gDBIs3XgLOROVHtzMx9zmSYILc0aRVY7k8we3b4TxCw,44227
|
|
5
|
+
singlestoredb/converters.py,sha256=aH_QhLr94i9_AjvcplTar0HfX2yi53KGxHHzJc7lSU0,12515
|
|
6
|
+
singlestoredb/exceptions.py,sha256=HuoA6sMRL5qiCiee-_5ddTGmFbYC9Euk8TYUsh5GvTw,3234
|
|
7
|
+
singlestoredb/pytest.py,sha256=OyF3BO9mgxenifYhOihnzGk8WzCJ_zN5_mxe8XyFPOc,9074
|
|
8
|
+
singlestoredb/types.py,sha256=FIqO1A7e0Gkk7ITmIysBy-P5S--ItbMSlYvblzqGS30,9969
|
|
9
|
+
singlestoredb/alchemy/__init__.py,sha256=dXRThusYrs_9GjrhPOw0-vw94in_T8yY9jE7SGCqiQk,2523
|
|
10
|
+
singlestoredb/functions/__init__.py,sha256=WL1LqgMTdnGOse3tQqmD-HH8TdfCPS89GNO7hO0v_aw,41
|
|
11
|
+
singlestoredb/functions/decorator.py,sha256=H12MUeBw8VOppx6esntaR43ukeIffbnAr716CBpYJ4g,5193
|
|
12
|
+
singlestoredb/functions/dtypes.py,sha256=iP3_AvE2jBxlkziOHzoUvTtYCdBZlaxJHNgvGwp07Ao,36712
|
|
13
|
+
singlestoredb/functions/signature.py,sha256=fNnlTfc0R0sM9wm78UwG7Ok9eMJTtOfawrIpjts2wdY,18866
|
|
14
|
+
singlestoredb/functions/ext/__init__.py,sha256=kGCV3QC5pL95TytpI8pwvSVCqqoTrV8duQQEUp65sy4,66
|
|
15
|
+
singlestoredb/functions/ext/arrow.py,sha256=WB7n1ACslyd8nlbFzUvlbxn1BVuEjA9-BGBEqCWlSOo,9061
|
|
16
|
+
singlestoredb/functions/ext/asgi.py,sha256=3Rp0m2DNf5yzbCQpaazTTVoDCPfp3jT6dJ7MlvHijw0,21938
|
|
17
|
+
singlestoredb/functions/ext/json.py,sha256=UuUxTzlr5ztAbXqOGaVGUhO7xFN_oBY75nFh9B8cRog,10372
|
|
18
|
+
singlestoredb/functions/ext/mmap.py,sha256=lvdKiGPh-H7LfkrYbPvcH5BWv9zuz7t2FAvW-nYdWzI,9759
|
|
19
|
+
singlestoredb/functions/ext/rowdat_1.py,sha256=yZElsItSbVTFlXU3N-ee6QIybxuksqwv1UE3Y6h45c0,22274
|
|
20
|
+
singlestoredb/fusion/__init__.py,sha256=Qo7SuqGw-l-vE8-EI2jhm6hXJkYfOLUKIws9c7LFNX0,356
|
|
21
|
+
singlestoredb/fusion/graphql.py,sha256=ZA3HcDq5rER-dCEavwTqnF7KM0D2LCYIY7nLQk7lSso,5207
|
|
22
|
+
singlestoredb/fusion/handler.py,sha256=7Oau7A5mclO5t3egH2FINxo8By6zpwzAQLCMFIo9CCo,18338
|
|
23
|
+
singlestoredb/fusion/registry.py,sha256=xpaWO9Bne5QYSE0ump1NcyHimFQSYW49gu3NSPBhLCI,4084
|
|
24
|
+
singlestoredb/fusion/result.py,sha256=Bd3KbRpqWqQcWp_Chd4bzBy8Kfc8nXLS_Pn_GGbPO6o,11772
|
|
25
|
+
singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
+
singlestoredb/fusion/handlers/stage.py,sha256=Abj59HZyy7kUWwujG-7FZ9-8d14W3XWRc3XfOMgBeng,6386
|
|
27
|
+
singlestoredb/fusion/handlers/utils.py,sha256=oYbf13Y3orEkJfHMNnO7B_W1anEdK-0S9vVVkF2pPFk,5109
|
|
28
|
+
singlestoredb/fusion/handlers/workspace.py,sha256=hHE6ZTrt3wWnQsTMkEiiWWFiQend4VNTebX382Ot5FI,11342
|
|
29
|
+
singlestoredb/http/__init__.py,sha256=A_2ZUCCpvRYIA6YDpPy57wL5R1eZ5SfP6I1To5nfJ2s,912
|
|
30
|
+
singlestoredb/http/connection.py,sha256=YcUfY_GzpSz-XYTkVQCayct9eQvwhscwVfStLbNry_U,37410
|
|
31
|
+
singlestoredb/management/__init__.py,sha256=jXtKvpvl5diiotXPiEi2EpJwhPLEMb4_MTpndjCz3Kg,202
|
|
32
|
+
singlestoredb/management/billing_usage.py,sha256=9ighjIpcopgIyJOktBYQ6pahBZmWGHOPyyCW4gu9FGs,3735
|
|
33
|
+
singlestoredb/management/cluster.py,sha256=_TT4tV43VPDrtcdS_VN-TTYij7yFQzjAMeuYRF9zKj8,14362
|
|
34
|
+
singlestoredb/management/manager.py,sha256=m8I5zTmEqjMCEE4fmmVdzza8TvofhnIHvO0np0WH-Y8,8810
|
|
35
|
+
singlestoredb/management/organization.py,sha256=Oj4-VQoEc90hLQ9vxXu4fSrGWK_Qq5lftmkM1Q5l6lk,4916
|
|
36
|
+
singlestoredb/management/region.py,sha256=HnLcWUh7r_aLECliplCDHak4a_F3B7LOSXEYMW66qD0,1611
|
|
37
|
+
singlestoredb/management/utils.py,sha256=sJlAmvHsqvgkFmpyXd4qIDoVi0Mxh9KGBGf_uF3cU4g,9197
|
|
38
|
+
singlestoredb/management/workspace.py,sha256=gea-ehcd_HlmjqfiEeW7w9nMOG3aLsIW9xDPGjWELXs,59380
|
|
39
|
+
singlestoredb/mysql/__init__.py,sha256=olUTAvkiERhDW41JXQMawkg-i0tvBEkoTkII1tt6lxU,4492
|
|
40
|
+
singlestoredb/mysql/_auth.py,sha256=AugRitoUwgRIDFuJxuAH4MWIAmckY7Ji2pP6r_Ng9dY,8043
|
|
41
|
+
singlestoredb/mysql/charset.py,sha256=-FlONDS_oAUF5B3mIgeHBPb_SCt4zHD33arUeBNctU0,10510
|
|
42
|
+
singlestoredb/mysql/connection.py,sha256=VzVZTSRdRcJ521rkFeZVmeYPkV_LDxLjDrxEJ6fHZhg,64746
|
|
43
|
+
singlestoredb/mysql/converters.py,sha256=CVe8SDmjbIAhy1xpQ2N5OKWw6t5eWpw-EU3QTlA0Hh0,7500
|
|
44
|
+
singlestoredb/mysql/cursors.py,sha256=aWs4AzmeZJJltOmUU3GZNBWgod9nqnnFW5OHVquz5t0,21246
|
|
45
|
+
singlestoredb/mysql/err.py,sha256=-m5rqXi8yhq6b8SCEJ2h0E5Rudh_15dlAU_WbJ1YrM8,2388
|
|
46
|
+
singlestoredb/mysql/optionfile.py,sha256=DqL-rOQcqQncD5eVbPRkwZqo7Pj3Vh40VLx3E_e87TU,655
|
|
47
|
+
singlestoredb/mysql/protocol.py,sha256=mPkF1xfSbqoW2dr8Tk4MpOKXRs_5Qj6xGFWSxo-AwhA,12180
|
|
48
|
+
singlestoredb/mysql/times.py,sha256=2j7purNVnJmjhOUgwUze-r3kNlCWqxjXj-jtqOzBfZI,463
|
|
49
|
+
singlestoredb/mysql/constants/CLIENT.py,sha256=SSvMFPZCTVMU1UWa4zOrfhYMDdR2wG2mS0E5GzJhDsg,878
|
|
50
|
+
singlestoredb/mysql/constants/COMMAND.py,sha256=TGITAUcNWlq2Gwg2wv5UK2ykdTd4LYTk_EcJJOCpGIc,679
|
|
51
|
+
singlestoredb/mysql/constants/CR.py,sha256=z3Oa86nHVDgWcz_XYFOzkfvvfkZmEoNluzpbNOJxjKg,2305
|
|
52
|
+
singlestoredb/mysql/constants/ER.py,sha256=cH5wgU-e70wd0uSygNR5IFCnnXcrR9WLwJPMH22bhUw,12296
|
|
53
|
+
singlestoredb/mysql/constants/FIELD_TYPE.py,sha256=OU0MQ_NtfLEFG5Jy0Oay7rhhlkfGldyzxjf1rGaSN2M,382
|
|
54
|
+
singlestoredb/mysql/constants/FLAG.py,sha256=Fy-PrCLnUI7fx_o5WypYnUAzWAM0E9d5yL8fFRVKffY,214
|
|
55
|
+
singlestoredb/mysql/constants/SERVER_STATUS.py,sha256=m28Iq5JGCFCWLhafE73-iOvw_9gDGqnytW3NkHpbugA,333
|
|
56
|
+
singlestoredb/mysql/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
|
+
singlestoredb/mysql/tests/__init__.py,sha256=JFzNFYLRD6dxD9ZvGgGIZOWPMYKW8b4tywBsb_I51J4,997
|
|
58
|
+
singlestoredb/mysql/tests/base.py,sha256=sv_VpPrJDvCt2QRlikG6_YWU3yJX3KEkdc96YRXGvEI,4025
|
|
59
|
+
singlestoredb/mysql/tests/conftest.py,sha256=vWjt2DEnzwlXuOBbz3p_EZXXDopucKGXHsPPPmCAmms,1117
|
|
60
|
+
singlestoredb/mysql/tests/test_DictCursor.py,sha256=oxn_q4DJTT6XqByCzKt0zQYw24_k768_8YJhpYUkDmE,4878
|
|
61
|
+
singlestoredb/mysql/tests/test_SSCursor.py,sha256=1IySbqn6a-1Wt7S04HxO3mUZstVmKIuy0vF8B0ZT06I,4306
|
|
62
|
+
singlestoredb/mysql/tests/test_basic.py,sha256=MsOP0zCvH9Kx1F1guLG4Iiir5ePD-3In_PCNyAJp1Cc,15465
|
|
63
|
+
singlestoredb/mysql/tests/test_connection.py,sha256=MRS4mU9pO4-Ga2GYWRdo640CHH7PTZtucdqB278Srlg,32297
|
|
64
|
+
singlestoredb/mysql/tests/test_converters.py,sha256=lNxgzbkfhw55mYFwSczUJeJHOsY-jXSqjeihdEQuV0w,2002
|
|
65
|
+
singlestoredb/mysql/tests/test_cursor.py,sha256=1OGzKzf7UCcF96X2XN8GnB9xIiUVyXn4GOuzW7hp6Cw,5045
|
|
66
|
+
singlestoredb/mysql/tests/test_err.py,sha256=nxMjsP9aCHT58aIPIrFyPveo2UZaHMYz4voDgY4Wnr0,422
|
|
67
|
+
singlestoredb/mysql/tests/test_issues.py,sha256=Rv0IJaYQu_u88O_pgURpT6V8Eo-cMitjpV59hT9EKrI,18965
|
|
68
|
+
singlestoredb/mysql/tests/test_load_local.py,sha256=EVz1O9LDR31GrvU97eEpBddHaTUhX-zifdUvgCFuICE,2502
|
|
69
|
+
singlestoredb/mysql/tests/test_nextset.py,sha256=CdiCOeZI5a_pdnjMmnQaJLCqUoXeugFj0IhOkJ_LLTA,2725
|
|
70
|
+
singlestoredb/mysql/tests/test_optionfile.py,sha256=eb2WaNzKKu7TjpRmWBAgjv8yXJptyGH964H1Uhuy-U4,585
|
|
71
|
+
singlestoredb/mysql/tests/thirdparty/__init__.py,sha256=M1hysF-gCD33Q8msVNoTDYJ8Lq3xyOlxXe3dUwPySjg,117
|
|
72
|
+
singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py,sha256=bG2vIeDuGH568xEQjM_YTvnJNgOLB9ofLmwfrBmicQc,307
|
|
73
|
+
singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py,sha256=AgEdvx7Njz_Y7KDMeQPMYI7y4nJRKblocVrC0VxVZZE,10171
|
|
74
|
+
singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py,sha256=E5_jnyZEZ7_mZw_P4EAzxMSSgvU8DXpp1kTM_kubdbs,31414
|
|
75
|
+
singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py,sha256=szE4Zodgf7YwhkMBOrCvUwhTWppVtaodsqlV-vJ7fmY,3090
|
|
76
|
+
singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py,sha256=t_OzqsVnj_ReBbmY_wx51ZcWbLz9nASZ0hno-9YeiyQ,8022
|
|
77
|
+
singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py,sha256=pl0bvuZo_nzAlYOINxRiR-Zi9khz0W2Pc7vP-K3sQYQ,2819
|
|
78
|
+
singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
79
|
+
singlestoredb/tests/empty.sql,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
80
|
+
singlestoredb/tests/local_infile.csv,sha256=sBtqjvfkS9aoOVx8nMXYgYv4rDuT4OuYhqUhNRu0O68,42
|
|
81
|
+
singlestoredb/tests/test.sql,sha256=zuckJJgKI8cjIkM03WC67hCTk75TSJYVNA3x9VLQWH4,9954
|
|
82
|
+
singlestoredb/tests/test2.sql,sha256=D4U2GSlOVeo39U8-RMM4YziJzYFfi4Ztm2YXJVJVAS8,37
|
|
83
|
+
singlestoredb/tests/test_basics.py,sha256=rUfUGZ54xybvgp11XYWdqnUYMKa6VckB3XkX9LFnxRw,44180
|
|
84
|
+
singlestoredb/tests/test_config.py,sha256=63lyIQ2KrvGE6C9403B_4Mc90mX4tp42ys5Bih2sXrE,11184
|
|
85
|
+
singlestoredb/tests/test_connection.py,sha256=RiE_NATLYPiMR5jWaBlcP5YddwitS6dzOHOVVOVXCSI,50741
|
|
86
|
+
singlestoredb/tests/test_dbapi.py,sha256=IKq5Hcwx8WikASP8_AB5fo3TXv7ryWPCVGonoly00gI,652
|
|
87
|
+
singlestoredb/tests/test_exceptions.py,sha256=tfr_8X2w1UmG4nkSBzWGB0C7ehrf1GAVgj6_ODaG-TM,1131
|
|
88
|
+
singlestoredb/tests/test_ext_func.py,sha256=Q-ZOl7fn6XfiHpHgxLvaBi7KSVzIehbS-cthitXpe8g,37347
|
|
89
|
+
singlestoredb/tests/test_ext_func_data.py,sha256=9Zb0Z1v-Yr0uOc97NJwPWuvJB49pLhzWKZtZWt-e7-Y,47693
|
|
90
|
+
singlestoredb/tests/test_fusion.py,sha256=UPaxXt5YNa3GS44l4oZfmUcq89YgN7EWWIbW_oCkYao,15100
|
|
91
|
+
singlestoredb/tests/test_http.py,sha256=RXasTqBWRn__omj0eLFTJYIbZjd0PPdIV2d4Cqz0MC8,8580
|
|
92
|
+
singlestoredb/tests/test_management.py,sha256=P5I50_gt1VE5ja4CNVo0j10fmwAqE57psxCvI_RWRFI,28223
|
|
93
|
+
singlestoredb/tests/test_plugin.py,sha256=qpO9wmWc62VaijN1sJ97YSYIX7I7Y5C6sY-WzwrutDQ,812
|
|
94
|
+
singlestoredb/tests/test_results.py,sha256=wg93sujwt-R9_eJCgSCElgAZhLDkIiAo3qPkPydOv78,6582
|
|
95
|
+
singlestoredb/tests/test_types.py,sha256=jqoAaSjhbgwB3vt0KsTcl7XBWoMMIa0mPFKhEi5bBjo,4500
|
|
96
|
+
singlestoredb/tests/test_udf.py,sha256=2Ml6VMTKIfstB-L31uX-zftwPsT5C64M29WZ6iuKdjI,28075
|
|
97
|
+
singlestoredb/tests/test_xdict.py,sha256=fqHspoi39nbX3fIDVkkRXcd5H50xdOsSvK0bxAMQnaE,10408
|
|
98
|
+
singlestoredb/tests/utils.py,sha256=76eNdYFVnsw6S3J_RaGgGQ87Rlm8pxwyYaFYXnvAEvk,4673
|
|
99
|
+
singlestoredb/tests/ext_funcs/__init__.py,sha256=qZLnDI_Ck0tguVi-K-BKXDHAcC0jui3dsm93Djj4x08,9290
|
|
100
|
+
singlestoredb/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
101
|
+
singlestoredb/utils/config.py,sha256=m3Xn6hsbdKyLufSnbokhFJ9Vfaz9Qpkj1IEnIiH9oJQ,24503
|
|
102
|
+
singlestoredb/utils/convert_rows.py,sha256=A6up7a8Bq-eV2BXdGCotQviqp1Q7XdJ2MA9339hLYVQ,1816
|
|
103
|
+
singlestoredb/utils/debug.py,sha256=0JiLA37u_9CKiDGiN9BK_PtFMUku3vIcNjERWaTNRSU,349
|
|
104
|
+
singlestoredb/utils/mogrify.py,sha256=-a56IF70U6CkfadeaZgfjRSVsAD3PuqRrzPpjZlgbwY,4050
|
|
105
|
+
singlestoredb/utils/results.py,sha256=cqFK4-0CBSDcT-R1ixKIWN5_sCn9s9SoEO6Gllj8mCI,5204
|
|
106
|
+
singlestoredb/utils/xdict.py,sha256=S9HKgrPrnu_6b7iOwa2KrW8CmU1Uqx0BWdEyogFzWbE,12896
|
|
107
|
+
singlestoredb-1.0.4.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
|
|
108
|
+
singlestoredb-1.0.4.dist-info/METADATA,sha256=915Z6b0vs9PUD13g_QPouiz13qx9kfjqTpTuSnZdnow,5515
|
|
109
|
+
singlestoredb-1.0.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
110
|
+
singlestoredb-1.0.4.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
|
|
111
|
+
singlestoredb-1.0.4.dist-info/top_level.txt,sha256=eet8bVPNRqiGeY0PrO5ERH2UpamwlrKHEQCffz4dOh8,14
|
|
112
|
+
singlestoredb-1.0.4.dist-info/RECORD,,
|