singlestoredb 1.16.1__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.
- singlestoredb/__init__.py +75 -0
- singlestoredb/ai/__init__.py +2 -0
- singlestoredb/ai/chat.py +139 -0
- singlestoredb/ai/embeddings.py +128 -0
- singlestoredb/alchemy/__init__.py +90 -0
- singlestoredb/apps/__init__.py +3 -0
- singlestoredb/apps/_cloud_functions.py +90 -0
- singlestoredb/apps/_config.py +72 -0
- singlestoredb/apps/_connection_info.py +18 -0
- singlestoredb/apps/_dashboards.py +47 -0
- singlestoredb/apps/_process.py +32 -0
- singlestoredb/apps/_python_udfs.py +100 -0
- singlestoredb/apps/_stdout_supress.py +30 -0
- singlestoredb/apps/_uvicorn_util.py +36 -0
- singlestoredb/auth.py +245 -0
- singlestoredb/config.py +484 -0
- singlestoredb/connection.py +1487 -0
- singlestoredb/converters.py +950 -0
- singlestoredb/docstring/__init__.py +33 -0
- singlestoredb/docstring/attrdoc.py +126 -0
- singlestoredb/docstring/common.py +230 -0
- singlestoredb/docstring/epydoc.py +267 -0
- singlestoredb/docstring/google.py +412 -0
- singlestoredb/docstring/numpydoc.py +562 -0
- singlestoredb/docstring/parser.py +100 -0
- singlestoredb/docstring/py.typed +1 -0
- singlestoredb/docstring/rest.py +256 -0
- singlestoredb/docstring/tests/__init__.py +1 -0
- singlestoredb/docstring/tests/_pydoctor.py +21 -0
- singlestoredb/docstring/tests/test_epydoc.py +729 -0
- singlestoredb/docstring/tests/test_google.py +1007 -0
- singlestoredb/docstring/tests/test_numpydoc.py +1100 -0
- singlestoredb/docstring/tests/test_parse_from_object.py +109 -0
- singlestoredb/docstring/tests/test_parser.py +248 -0
- singlestoredb/docstring/tests/test_rest.py +547 -0
- singlestoredb/docstring/tests/test_util.py +70 -0
- singlestoredb/docstring/util.py +141 -0
- singlestoredb/exceptions.py +120 -0
- singlestoredb/functions/__init__.py +16 -0
- singlestoredb/functions/decorator.py +201 -0
- singlestoredb/functions/dtypes.py +1793 -0
- singlestoredb/functions/ext/__init__.py +1 -0
- singlestoredb/functions/ext/arrow.py +375 -0
- singlestoredb/functions/ext/asgi.py +2133 -0
- singlestoredb/functions/ext/json.py +420 -0
- singlestoredb/functions/ext/mmap.py +413 -0
- singlestoredb/functions/ext/rowdat_1.py +724 -0
- singlestoredb/functions/ext/timer.py +89 -0
- singlestoredb/functions/ext/utils.py +218 -0
- singlestoredb/functions/signature.py +1578 -0
- singlestoredb/functions/typing/__init__.py +41 -0
- singlestoredb/functions/typing/numpy.py +20 -0
- singlestoredb/functions/typing/pandas.py +2 -0
- singlestoredb/functions/typing/polars.py +2 -0
- singlestoredb/functions/typing/pyarrow.py +2 -0
- singlestoredb/functions/utils.py +421 -0
- singlestoredb/fusion/__init__.py +11 -0
- singlestoredb/fusion/graphql.py +213 -0
- singlestoredb/fusion/handler.py +916 -0
- singlestoredb/fusion/handlers/__init__.py +0 -0
- singlestoredb/fusion/handlers/export.py +525 -0
- singlestoredb/fusion/handlers/files.py +690 -0
- singlestoredb/fusion/handlers/job.py +660 -0
- singlestoredb/fusion/handlers/models.py +250 -0
- singlestoredb/fusion/handlers/stage.py +502 -0
- singlestoredb/fusion/handlers/utils.py +324 -0
- singlestoredb/fusion/handlers/workspace.py +956 -0
- singlestoredb/fusion/registry.py +249 -0
- singlestoredb/fusion/result.py +399 -0
- singlestoredb/http/__init__.py +27 -0
- singlestoredb/http/connection.py +1267 -0
- singlestoredb/magics/__init__.py +34 -0
- singlestoredb/magics/run_personal.py +137 -0
- singlestoredb/magics/run_shared.py +134 -0
- singlestoredb/management/__init__.py +9 -0
- singlestoredb/management/billing_usage.py +148 -0
- singlestoredb/management/cluster.py +462 -0
- singlestoredb/management/export.py +295 -0
- singlestoredb/management/files.py +1102 -0
- singlestoredb/management/inference_api.py +105 -0
- singlestoredb/management/job.py +887 -0
- singlestoredb/management/manager.py +373 -0
- singlestoredb/management/organization.py +226 -0
- singlestoredb/management/region.py +169 -0
- singlestoredb/management/utils.py +423 -0
- singlestoredb/management/workspace.py +1927 -0
- singlestoredb/mysql/__init__.py +177 -0
- singlestoredb/mysql/_auth.py +298 -0
- singlestoredb/mysql/charset.py +214 -0
- singlestoredb/mysql/connection.py +2032 -0
- singlestoredb/mysql/constants/CLIENT.py +38 -0
- singlestoredb/mysql/constants/COMMAND.py +32 -0
- singlestoredb/mysql/constants/CR.py +78 -0
- singlestoredb/mysql/constants/ER.py +474 -0
- singlestoredb/mysql/constants/EXTENDED_TYPE.py +3 -0
- singlestoredb/mysql/constants/FIELD_TYPE.py +48 -0
- singlestoredb/mysql/constants/FLAG.py +15 -0
- singlestoredb/mysql/constants/SERVER_STATUS.py +10 -0
- singlestoredb/mysql/constants/VECTOR_TYPE.py +6 -0
- singlestoredb/mysql/constants/__init__.py +0 -0
- singlestoredb/mysql/converters.py +271 -0
- singlestoredb/mysql/cursors.py +896 -0
- singlestoredb/mysql/err.py +92 -0
- singlestoredb/mysql/optionfile.py +20 -0
- singlestoredb/mysql/protocol.py +450 -0
- singlestoredb/mysql/tests/__init__.py +19 -0
- singlestoredb/mysql/tests/base.py +126 -0
- singlestoredb/mysql/tests/conftest.py +37 -0
- singlestoredb/mysql/tests/test_DictCursor.py +132 -0
- singlestoredb/mysql/tests/test_SSCursor.py +141 -0
- singlestoredb/mysql/tests/test_basic.py +452 -0
- singlestoredb/mysql/tests/test_connection.py +851 -0
- singlestoredb/mysql/tests/test_converters.py +58 -0
- singlestoredb/mysql/tests/test_cursor.py +141 -0
- singlestoredb/mysql/tests/test_err.py +16 -0
- singlestoredb/mysql/tests/test_issues.py +514 -0
- singlestoredb/mysql/tests/test_load_local.py +75 -0
- singlestoredb/mysql/tests/test_nextset.py +88 -0
- singlestoredb/mysql/tests/test_optionfile.py +27 -0
- singlestoredb/mysql/tests/thirdparty/__init__.py +6 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +323 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +865 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +110 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +224 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +101 -0
- singlestoredb/mysql/times.py +23 -0
- singlestoredb/notebook/__init__.py +16 -0
- singlestoredb/notebook/_objects.py +213 -0
- singlestoredb/notebook/_portal.py +352 -0
- singlestoredb/py.typed +0 -0
- singlestoredb/pytest.py +352 -0
- singlestoredb/server/__init__.py +0 -0
- singlestoredb/server/docker.py +452 -0
- singlestoredb/server/free_tier.py +267 -0
- singlestoredb/tests/__init__.py +0 -0
- singlestoredb/tests/alltypes.sql +307 -0
- singlestoredb/tests/alltypes_no_nulls.sql +208 -0
- singlestoredb/tests/empty.sql +0 -0
- singlestoredb/tests/ext_funcs/__init__.py +702 -0
- singlestoredb/tests/local_infile.csv +3 -0
- singlestoredb/tests/test.ipynb +18 -0
- singlestoredb/tests/test.sql +680 -0
- singlestoredb/tests/test2.ipynb +18 -0
- singlestoredb/tests/test2.sql +1 -0
- singlestoredb/tests/test_basics.py +1332 -0
- singlestoredb/tests/test_config.py +318 -0
- singlestoredb/tests/test_connection.py +3103 -0
- singlestoredb/tests/test_dbapi.py +27 -0
- singlestoredb/tests/test_exceptions.py +45 -0
- singlestoredb/tests/test_ext_func.py +1472 -0
- singlestoredb/tests/test_ext_func_data.py +1101 -0
- singlestoredb/tests/test_fusion.py +1527 -0
- singlestoredb/tests/test_http.py +288 -0
- singlestoredb/tests/test_management.py +1599 -0
- singlestoredb/tests/test_plugin.py +33 -0
- singlestoredb/tests/test_results.py +171 -0
- singlestoredb/tests/test_types.py +132 -0
- singlestoredb/tests/test_udf.py +737 -0
- singlestoredb/tests/test_udf_returns.py +459 -0
- singlestoredb/tests/test_vectorstore.py +51 -0
- singlestoredb/tests/test_xdict.py +333 -0
- singlestoredb/tests/utils.py +141 -0
- singlestoredb/types.py +373 -0
- singlestoredb/utils/__init__.py +0 -0
- singlestoredb/utils/config.py +950 -0
- singlestoredb/utils/convert_rows.py +69 -0
- singlestoredb/utils/debug.py +13 -0
- singlestoredb/utils/dtypes.py +205 -0
- singlestoredb/utils/events.py +65 -0
- singlestoredb/utils/mogrify.py +151 -0
- singlestoredb/utils/results.py +585 -0
- singlestoredb/utils/xdict.py +425 -0
- singlestoredb/vectorstore.py +192 -0
- singlestoredb/warnings.py +5 -0
- singlestoredb-1.16.1.dist-info/METADATA +165 -0
- singlestoredb-1.16.1.dist-info/RECORD +183 -0
- singlestoredb-1.16.1.dist-info/WHEEL +5 -0
- singlestoredb-1.16.1.dist-info/entry_points.txt +2 -0
- singlestoredb-1.16.1.dist-info/licenses/LICENSE +201 -0
- singlestoredb-1.16.1.dist-info/top_level.txt +3 -0
- sqlx/__init__.py +4 -0
- sqlx/magic.py +113 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import time
|
|
3
|
+
from decimal import Decimal
|
|
4
|
+
from typing import Any
|
|
5
|
+
from typing import Callable
|
|
6
|
+
from typing import Dict
|
|
7
|
+
from typing import Optional
|
|
8
|
+
from typing import Tuple
|
|
9
|
+
from typing import Union
|
|
10
|
+
|
|
11
|
+
from ..converters import converters as decoders
|
|
12
|
+
from .err import ProgrammingError
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
import numpy as np
|
|
16
|
+
has_numpy = True
|
|
17
|
+
except ImportError:
|
|
18
|
+
has_numpy = False
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
import shapely.geometry
|
|
22
|
+
import shapely.wkt
|
|
23
|
+
has_shapely = True
|
|
24
|
+
except ImportError:
|
|
25
|
+
has_shapely = False
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
import pygeos
|
|
29
|
+
has_pygeos = True
|
|
30
|
+
except ImportError:
|
|
31
|
+
has_pygeos = False
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
Encoders = Dict[type, Callable[..., Union[str, Dict[str, str]]]]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def escape_item(val: Any, charset: str, mapping: Optional[Encoders] = None) -> str:
|
|
38
|
+
if mapping is None:
|
|
39
|
+
mapping = encoders
|
|
40
|
+
encoder = mapping.get(type(val), None)
|
|
41
|
+
|
|
42
|
+
# Fallback to default when no encoder found
|
|
43
|
+
if encoder is None:
|
|
44
|
+
try:
|
|
45
|
+
encoder = mapping[str]
|
|
46
|
+
except KeyError:
|
|
47
|
+
raise TypeError('no default type converter defined')
|
|
48
|
+
|
|
49
|
+
if encoder in (escape_dict, escape_sequence):
|
|
50
|
+
val = encoder(val, charset, mapping)
|
|
51
|
+
else:
|
|
52
|
+
val = encoder(val, mapping)
|
|
53
|
+
return val
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def escape_dict(
|
|
57
|
+
val: Dict[str, Any],
|
|
58
|
+
charset: str,
|
|
59
|
+
mapping: Optional[Encoders] = None,
|
|
60
|
+
) -> Dict[str, str]:
|
|
61
|
+
n = {}
|
|
62
|
+
for k, v in val.items():
|
|
63
|
+
quoted = escape_item(v, charset, mapping)
|
|
64
|
+
n[k] = quoted
|
|
65
|
+
return n
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def escape_sequence(
|
|
69
|
+
val: Any,
|
|
70
|
+
charset: str,
|
|
71
|
+
mapping: Optional[Encoders] = None,
|
|
72
|
+
) -> str:
|
|
73
|
+
n = []
|
|
74
|
+
for item in val:
|
|
75
|
+
quoted = escape_item(item, charset, mapping)
|
|
76
|
+
n.append(quoted)
|
|
77
|
+
return '(' + ','.join(n) + ')'
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def escape_set(val: Any, charset: str, mapping: Optional[Encoders] = None) -> str:
|
|
81
|
+
return ','.join([escape_item(x, charset, mapping) for x in val])
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def escape_bool(value: Any, mapping: Optional[Encoders] = None) -> str:
|
|
85
|
+
return str(int(value))
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def escape_int(value: Any, mapping: Optional[Encoders] = None) -> str:
|
|
89
|
+
return str(value)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def escape_float(
|
|
93
|
+
value: Any,
|
|
94
|
+
mapping: Optional[Encoders] = None,
|
|
95
|
+
nan_as_null: bool = False,
|
|
96
|
+
inf_as_null: bool = False,
|
|
97
|
+
) -> str:
|
|
98
|
+
s = repr(value)
|
|
99
|
+
if s == 'nan':
|
|
100
|
+
if nan_as_null:
|
|
101
|
+
return 'NULL'
|
|
102
|
+
raise ProgrammingError(0, '%s can not be used with SingleStoreDB' % s)
|
|
103
|
+
if s == 'inf':
|
|
104
|
+
if inf_as_null:
|
|
105
|
+
return 'NULL'
|
|
106
|
+
raise ProgrammingError(0, '%s can not be used with SingleStoreDB' % s)
|
|
107
|
+
if 'e' not in s:
|
|
108
|
+
s += 'e0'
|
|
109
|
+
return s
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
_escape_table = [chr(x) for x in range(128)]
|
|
113
|
+
_escape_table[0] = '\\0'
|
|
114
|
+
_escape_table[ord('\\')] = '\\\\'
|
|
115
|
+
_escape_table[ord('\n')] = '\\n'
|
|
116
|
+
_escape_table[ord('\r')] = '\\r'
|
|
117
|
+
_escape_table[ord('\032')] = '\\Z'
|
|
118
|
+
_escape_table[ord('"')] = '\\"'
|
|
119
|
+
_escape_table[ord("'")] = "\\'"
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def escape_string(value: str, mapping: Optional[Encoders] = None) -> str:
|
|
123
|
+
"""
|
|
124
|
+
Escapes *value* without adding quote.
|
|
125
|
+
|
|
126
|
+
Value should be unicode
|
|
127
|
+
|
|
128
|
+
"""
|
|
129
|
+
return value.translate(_escape_table)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def escape_bytes_prefixed(value: bytes, mapping: Optional[Encoders] = None) -> str:
|
|
133
|
+
return "_binary X'{}'".format(value.hex())
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def escape_bytes(value: bytes, mapping: Optional[Encoders] = None) -> str:
|
|
137
|
+
return "X'{}'".format(value.hex())
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def escape_str(value: str, mapping: Optional[Encoders] = None) -> str:
|
|
141
|
+
return "'{}'".format(escape_string(str(value), mapping))
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def escape_None(value: str, mapping: Optional[Encoders] = None) -> str:
|
|
145
|
+
return 'NULL'
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def escape_timedelta(obj: datetime.timedelta, mapping: Optional[Encoders] = None) -> str:
|
|
149
|
+
seconds = int(obj.seconds) % 60
|
|
150
|
+
minutes = int(obj.seconds // 60) % 60
|
|
151
|
+
hours = int(obj.seconds // 3600) % 24 + int(obj.days) * 24
|
|
152
|
+
if obj.microseconds:
|
|
153
|
+
fmt = "'{0:02d}:{1:02d}:{2:02d}.{3:06d}'"
|
|
154
|
+
else:
|
|
155
|
+
fmt = "'{0:02d}:{1:02d}:{2:02d}'"
|
|
156
|
+
return fmt.format(hours, minutes, seconds, obj.microseconds)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def escape_time(obj: datetime.time, mapping: Optional[Encoders] = None) -> str:
|
|
160
|
+
if obj.microsecond:
|
|
161
|
+
fmt = "'{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}'"
|
|
162
|
+
else:
|
|
163
|
+
fmt = "'{0.hour:02}:{0.minute:02}:{0.second:02}'"
|
|
164
|
+
return fmt.format(obj)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def escape_datetime(obj: datetime.datetime, mapping: Optional[Encoders] = None) -> str:
|
|
168
|
+
if obj.microsecond:
|
|
169
|
+
fmt = "'{0.year:04}-{0.month:02}-{0.day:02} " \
|
|
170
|
+
"{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}'"
|
|
171
|
+
else:
|
|
172
|
+
fmt = "'{0.year:04}-{0.month:02}-{0.day:02} " \
|
|
173
|
+
"{0.hour:02}:{0.minute:02}:{0.second:02}'"
|
|
174
|
+
return fmt.format(obj)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def escape_date(obj: datetime.date, mapping: Optional[Encoders] = None) -> str:
|
|
178
|
+
fmt = "'{0.year:04}-{0.month:02}-{0.day:02}'"
|
|
179
|
+
return fmt.format(obj)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def escape_struct_time(obj: Tuple[Any, ...], mapping: Optional[Encoders] = None) -> str:
|
|
183
|
+
return escape_datetime(datetime.datetime(*obj[:6]))
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def Decimal2Literal(o: Any, d: Any) -> str:
|
|
187
|
+
return format(o, 'f')
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def through(x: Any) -> Any:
|
|
191
|
+
return x
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
# def convert_bit(b):
|
|
195
|
+
# b = "\x00" * (8 - len(b)) + b # pad w/ zeroes
|
|
196
|
+
# return struct.unpack(">Q", b)[0]
|
|
197
|
+
#
|
|
198
|
+
# the snippet above is right, but MySQLdb doesn't process bits,
|
|
199
|
+
# so we shouldn't either
|
|
200
|
+
convert_bit = through
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
encoders: Encoders = {
|
|
204
|
+
bool: escape_bool,
|
|
205
|
+
int: escape_int,
|
|
206
|
+
float: escape_float,
|
|
207
|
+
str: escape_str,
|
|
208
|
+
bytes: escape_bytes,
|
|
209
|
+
tuple: escape_sequence,
|
|
210
|
+
list: escape_sequence,
|
|
211
|
+
set: escape_sequence,
|
|
212
|
+
frozenset: escape_sequence,
|
|
213
|
+
dict: escape_dict,
|
|
214
|
+
type(None): escape_None,
|
|
215
|
+
datetime.date: escape_date,
|
|
216
|
+
datetime.datetime: escape_datetime,
|
|
217
|
+
datetime.timedelta: escape_timedelta,
|
|
218
|
+
datetime.time: escape_time,
|
|
219
|
+
time.struct_time: escape_struct_time,
|
|
220
|
+
Decimal: Decimal2Literal,
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if has_numpy:
|
|
224
|
+
|
|
225
|
+
def escape_numpy(value: Any, mapping: Optional[Encoders] = None) -> str:
|
|
226
|
+
"""Convert numpy arrays to vectors of bytes."""
|
|
227
|
+
return escape_bytes(value.tobytes(), mapping=mapping)
|
|
228
|
+
|
|
229
|
+
encoders[np.ndarray] = escape_numpy
|
|
230
|
+
encoders[np.float16] = escape_float
|
|
231
|
+
encoders[np.float32] = escape_float
|
|
232
|
+
encoders[np.float64] = escape_float
|
|
233
|
+
if hasattr(np, 'float128'):
|
|
234
|
+
encoders[np.float128] = escape_float
|
|
235
|
+
encoders[np.uint] = escape_int
|
|
236
|
+
encoders[np.uint8] = escape_int
|
|
237
|
+
encoders[np.uint16] = escape_int
|
|
238
|
+
encoders[np.uint32] = escape_int
|
|
239
|
+
encoders[np.uint64] = escape_int
|
|
240
|
+
encoders[np.integer] = escape_int
|
|
241
|
+
encoders[np.int_] = escape_int
|
|
242
|
+
encoders[np.int8] = escape_int
|
|
243
|
+
encoders[np.int16] = escape_int
|
|
244
|
+
encoders[np.int32] = escape_int
|
|
245
|
+
encoders[np.int64] = escape_int
|
|
246
|
+
|
|
247
|
+
if has_shapely:
|
|
248
|
+
|
|
249
|
+
def escape_shapely(value: Any, mapping: Optional[Encoders] = None) -> str:
|
|
250
|
+
"""Convert shapely geo objects."""
|
|
251
|
+
return escape_str(shapely.wkt.dumps(value), mapping=mapping)
|
|
252
|
+
|
|
253
|
+
encoders[shapely.geometry.Polygon] = escape_shapely
|
|
254
|
+
encoders[shapely.geometry.Point] = escape_shapely
|
|
255
|
+
encoders[shapely.geometry.LineString] = escape_shapely
|
|
256
|
+
|
|
257
|
+
if has_pygeos:
|
|
258
|
+
|
|
259
|
+
def escape_pygeos(value: Any, mapping: Optional[Encoders] = None) -> str:
|
|
260
|
+
"""Convert pygeos objects."""
|
|
261
|
+
return escape_str(pygeos.io.to_wkt(value), mapping=mapping)
|
|
262
|
+
|
|
263
|
+
encoders[pygeos.Geometry] = escape_pygeos
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
# for MySQLdb compatibility
|
|
267
|
+
conversions = encoders.copy() # type: ignore
|
|
268
|
+
conversions.update(decoders) # type: ignore
|
|
269
|
+
Thing2Literal = escape_str
|
|
270
|
+
|
|
271
|
+
# Run doctests with `pytest --doctest-modules pymysql/converters.py`
|