sqlalchemy-iris 0.17.1b3__tar.gz → 0.17.1b5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. {sqlalchemy_iris-0.17.1b3/sqlalchemy_iris.egg-info → sqlalchemy_iris-0.17.1b5}/PKG-INFO +1 -1
  2. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/setup.cfg +2 -2
  3. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/base.py +3 -8
  4. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/intersystems/__init__.py +28 -23
  5. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/requirements.py +2 -2
  6. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5/sqlalchemy_iris.egg-info}/PKG-INFO +1 -1
  7. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris.egg-info/SOURCES.txt +0 -1
  8. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/tests/test_alembic.py +12 -8
  9. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/tests/test_suite.py +0 -1
  10. sqlalchemy_iris-0.17.1b3/sqlalchemy_iris/intersystems/cursor.py +0 -17
  11. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/LICENSE +0 -0
  12. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/README.md +0 -0
  13. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_BufferReader.py +0 -0
  14. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_BufferWriter.py +0 -0
  15. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_ConnectionInformation.py +0 -0
  16. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_ConnectionParameters.py +0 -0
  17. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_Constant.py +0 -0
  18. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_DBList.py +0 -0
  19. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_Device.py +0 -0
  20. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_GatewayContext.py +0 -0
  21. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_GatewayException.py +0 -0
  22. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_GatewayUtility.py +0 -0
  23. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRIS.py +0 -0
  24. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISConnection.py +0 -0
  25. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISEmbedded.py +0 -0
  26. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISGlobalNode.py +0 -0
  27. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISGlobalNodeView.py +0 -0
  28. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISIterator.py +0 -0
  29. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISList.py +0 -0
  30. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISNative.py +0 -0
  31. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISOREF.py +0 -0
  32. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISObject.py +0 -0
  33. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_IRISReference.py +0 -0
  34. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_InStream.py +0 -0
  35. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_LegacyIterator.py +0 -0
  36. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_ListItem.py +0 -0
  37. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_ListReader.py +0 -0
  38. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_ListWriter.py +0 -0
  39. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_LogFileStream.py +0 -0
  40. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_MessageHeader.py +0 -0
  41. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_OutStream.py +0 -0
  42. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_PrintStream.py +0 -0
  43. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_PythonGateway.py +0 -0
  44. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/_SharedMemorySocket.py +0 -0
  45. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/__init__.py +0 -0
  46. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/__main__.py +0 -0
  47. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_Column.py +0 -0
  48. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_DBAPI.py +0 -0
  49. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_Descriptor.py +0 -0
  50. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_IRISStream.py +0 -0
  51. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_Message.py +0 -0
  52. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_Parameter.py +0 -0
  53. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_ParameterCollection.py +0 -0
  54. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_ResultSetRow.py +0 -0
  55. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/_SQLType.py +0 -0
  56. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/__init__.py +0 -0
  57. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/preparser/_PreParser.py +0 -0
  58. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/preparser/_Scanner.py +0 -0
  59. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/preparser/_Token.py +0 -0
  60. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/preparser/_TokenList.py +0 -0
  61. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/dbapi/preparser/__init__.py +0 -0
  62. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_BusinessHost.py +0 -0
  63. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_BusinessOperation.py +0 -0
  64. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_BusinessProcess.py +0 -0
  65. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_BusinessService.py +0 -0
  66. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_Common.py +0 -0
  67. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_Director.py +0 -0
  68. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_IRISBusinessOperation.py +0 -0
  69. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_IRISBusinessService.py +0 -0
  70. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_IRISInboundAdapter.py +0 -0
  71. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_IRISOutboundAdapter.py +0 -0
  72. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_InboundAdapter.py +0 -0
  73. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_Message.py +0 -0
  74. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/_OutboundAdapter.py +0 -0
  75. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/intersystems_iris/pex/__init__.py +0 -0
  76. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/irisnative/_IRISNative.py +0 -0
  77. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/irisnative/__init__.py +0 -0
  78. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/setup.py +0 -0
  79. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/__init__.py +0 -0
  80. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/alembic.py +0 -0
  81. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/embedded.py +0 -0
  82. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/information_schema.py +0 -0
  83. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/intersystems/dbapi.py +0 -0
  84. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/iris.py +0 -0
  85. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/irisasync.py +0 -0
  86. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/provision.py +0 -0
  87. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris/types.py +0 -0
  88. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris.egg-info/dependency_links.txt +0 -0
  89. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris.egg-info/entry_points.txt +0 -0
  90. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris.egg-info/requires.txt +0 -0
  91. {sqlalchemy_iris-0.17.1b3 → sqlalchemy_iris-0.17.1b5}/sqlalchemy_iris.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sqlalchemy-iris
3
- Version: 0.17.1b3
3
+ Version: 0.17.1b5
4
4
  Summary: InterSystems IRIS for SQLAlchemy
5
5
  Home-page: https://github.com/caretdev/sqlalchemy-iris
6
6
  Maintainer: CaretDev
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = sqlalchemy-iris
3
- version = 0.17.1b3
3
+ version = 0.17.1b5
4
4
  description = InterSystems IRIS for SQLAlchemy
5
5
  long_description = file: README.md
6
6
  url = https://github.com/caretdev/sqlalchemy-iris
@@ -33,7 +33,7 @@ intersystems =
33
33
  intersystems-irispython==5.1.0
34
34
 
35
35
  [tool:pytest]
36
- addopts = --tb native -v -r fxX --maxfail=25 -p no:warnings
36
+ addopts = --tb native -v -r fxX -p no:warnings
37
37
 
38
38
  [db]
39
39
  default = iris://_SYSTEM:SYS@localhost:1972/USER
@@ -971,11 +971,9 @@ There are no access to %Dictionary, may be required for some advanced features,
971
971
 
972
972
  def _get_option(self, connection, option):
973
973
  with connection.cursor() as cursor:
974
- cursor.execute("SELECT %SYSTEM_SQL.Util_GetOption(?)", option)
974
+ cursor.execute("SELECT %SYSTEM_SQL.Util_GetOption(?)", (option, ))
975
975
  row = cursor.fetchone()
976
- if row:
977
- return row[0]
978
- return None
976
+ return row[0] if row else None
979
977
 
980
978
  def _set_option(self, connection, option, value):
981
979
  with connection.cursor() as cursor:
@@ -1091,10 +1089,7 @@ There are no access to %Dictionary, may be required for some advanced features,
1091
1089
  if query.endswith(";"):
1092
1090
  query = query[:-1]
1093
1091
  self._debug(query, params)
1094
- try:
1095
- cursor.execute(query, params)
1096
- except Exception as ex:
1097
- raise ex
1092
+ cursor.execute(query, params)
1098
1093
 
1099
1094
  def do_executemany(self, cursor, query, params, context=None):
1100
1095
  if query.endswith(";"):
@@ -1,11 +1,11 @@
1
1
  import re
2
+ from typing import Any
2
3
  from ..base import IRISDialect
3
- from sqlalchemy import text, util
4
4
  from ..base import IRISExecutionContext
5
5
  from . import dbapi
6
- from .dbapi import connect, Cursor
7
- from .cursor import InterSystemsCursorFetchStrategy
6
+ from .dbapi import connect
8
7
  from .dbapi import IntegrityError, OperationalError, DatabaseError
8
+ from sqlalchemy.engine.cursor import CursorFetchStrategy
9
9
 
10
10
 
11
11
  def remap_exception(func):
@@ -19,7 +19,7 @@ def remap_exception(func):
19
19
  except RuntimeError as ex:
20
20
  # [SQLCODE: <-119>:...
21
21
  message = ex.args[0]
22
- if '<LIST ERROR>' in message:
22
+ if "<LIST ERROR>" in message:
23
23
  # just random error happens in the driver, try again
24
24
  continue
25
25
  sqlcode = re.findall(r"^\[SQLCODE: <(-\d+)>:", message)
@@ -27,27 +27,34 @@ def remap_exception(func):
27
27
  raise Exception(message)
28
28
  sqlcode = int(sqlcode[0])
29
29
  if abs(sqlcode) in [108, 119, 121, 122]:
30
- raise IntegrityError(message)
30
+ raise IntegrityError(sqlcode, message)
31
31
  if abs(sqlcode) in [1, 12]:
32
- raise OperationalError(message)
33
- raise DatabaseError(message)
32
+ raise OperationalError(sqlcode, message)
33
+ raise DatabaseError(sqlcode, message)
34
34
 
35
35
  return wrapper
36
36
 
37
37
 
38
+ class InterSystemsCursorFetchStrategy(CursorFetchStrategy):
39
+
40
+ def fetchone(
41
+ self,
42
+ result,
43
+ dbapi_cursor,
44
+ hard_close: bool = False,
45
+ ) -> Any:
46
+ row = dbapi_cursor.fetchone()
47
+ return tuple(row) if row else None
48
+
49
+
38
50
  class InterSystemsExecutionContext(IRISExecutionContext):
39
51
  cursor_fetch_strategy = InterSystemsCursorFetchStrategy()
40
52
 
41
- def create_cursor(self):
42
- cursor = self._dbapi_connection.cursor()
43
- cursor.sqlcode = 0
44
- return cursor
45
-
46
53
 
47
54
  class IRISDialect_intersystems(IRISDialect):
48
55
  driver = "intersystems"
49
56
 
50
- execution_ctx_cls = InterSystemsExecutionContext
57
+ # execution_ctx_cls = InterSystemsExecutionContext
51
58
 
52
59
  supports_statement_cache = True
53
60
 
@@ -123,23 +130,19 @@ class IRISDialect_intersystems(IRISDialect):
123
130
  if super_ is not None:
124
131
  super_(conn)
125
132
 
126
- server_version = dbapi.createIRIS(conn).classMethodValue("%SYSTEM.Version", "GetNumber")
133
+ server_version = dbapi.createIRIS(conn).classMethodValue(
134
+ "%SYSTEM.Version", "GetNumber"
135
+ )
127
136
  server_version = server_version.split(".")
128
- self.server_version = tuple([int("".join(filter(str.isdigit, v))) for v in server_version])
137
+ self.server_version = tuple(
138
+ [int("".join(filter(str.isdigit, v))) for v in server_version]
139
+ )
129
140
 
130
141
  return on_connect
131
142
 
132
143
  def _get_server_version_info(self, connection):
133
144
  return self.server_version
134
145
 
135
- def _get_option(self, connection, option):
136
- with connection.cursor() as cursor:
137
- cursor.execute("SELECT %SYSTEM_SQL.Util_GetOption(?)", (option,))
138
- row = cursor.fetchone()
139
- if row:
140
- return row[0]
141
- return None
142
-
143
146
  def set_isolation_level(self, connection, level_str):
144
147
  if level_str == "AUTOCOMMIT":
145
148
  connection.autocommit = True
@@ -150,6 +153,7 @@ class IRISDialect_intersystems(IRISDialect):
150
153
  with connection.cursor() as cursor:
151
154
  cursor.execute("SET TRANSACTION ISOLATION LEVEL " + level_str)
152
155
 
156
+ """
153
157
  @remap_exception
154
158
  def do_execute(self, cursor, query, params, context=None):
155
159
  if query.endswith(";"):
@@ -166,5 +170,6 @@ class IRISDialect_intersystems(IRISDialect):
166
170
  params = [param[0] if len(param) else None for param in params]
167
171
  cursor.executemany(query, params)
168
172
 
173
+ """
169
174
 
170
175
  dialect = IRISDialect_intersystems
@@ -960,8 +960,8 @@ class Requirements(SuiteRequirements, AlembicRequirements):
960
960
  literal string, e.g. via the TypeEngine.literal_processor() method.
961
961
 
962
962
  """
963
-
964
- return exclusions.open()
963
+ # works stable only on Community driver
964
+ return self.community_driver
965
965
 
966
966
  @property
967
967
  def datetime(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: sqlalchemy-iris
3
- Version: 0.17.1b3
3
+ Version: 0.17.1b5
4
4
  Summary: InterSystems IRIS for SQLAlchemy
5
5
  Home-page: https://github.com/caretdev/sqlalchemy-iris
6
6
  Maintainer: CaretDev
@@ -84,7 +84,6 @@ sqlalchemy_iris.egg-info/entry_points.txt
84
84
  sqlalchemy_iris.egg-info/requires.txt
85
85
  sqlalchemy_iris.egg-info/top_level.txt
86
86
  sqlalchemy_iris/intersystems/__init__.py
87
- sqlalchemy_iris/intersystems/cursor.py
88
87
  sqlalchemy_iris/intersystems/dbapi.py
89
88
  tests/test_alembic.py
90
89
  tests/test_suite.py
@@ -93,14 +93,18 @@ else:
93
93
  @classmethod
94
94
  def insert_data(cls, connection):
95
95
  connection.execute(
96
- text(
97
- """
98
- insert into tab (col) values
99
- ('some data 1'),
100
- ('some data 2'),
101
- ('some data 3')
102
- """
103
- )
96
+ cls.tables.tab.insert(),
97
+ [
98
+ {
99
+ "col": "some data 1",
100
+ },
101
+ {
102
+ "col": "some data 2",
103
+ },
104
+ {
105
+ "col": "some data 3",
106
+ },
107
+ ],
104
108
  )
105
109
 
106
110
  def test_str_to_blob(self, connection, ops_context):
@@ -22,7 +22,6 @@ from sqlalchemy_iris import INTEGER
22
22
  from sqlalchemy_iris import IRISListBuild
23
23
  from sqlalchemy_iris import IRISVector
24
24
  from sqlalchemy.exc import DatabaseError
25
- from sqlalchemy.testing.config import requirements
26
25
 
27
26
  import pytest
28
27
 
@@ -1,17 +0,0 @@
1
- from typing import Any
2
- from sqlalchemy import CursorResult
3
- from sqlalchemy.engine.cursor import CursorFetchStrategy
4
- from sqlalchemy.engine.interfaces import DBAPICursor
5
-
6
-
7
- class InterSystemsCursorFetchStrategy(CursorFetchStrategy):
8
-
9
- def fetchone(
10
- self,
11
- result: CursorResult[Any],
12
- dbapi_cursor: DBAPICursor,
13
- hard_close: bool = False,
14
- ) -> Any:
15
- row = dbapi_cursor.fetchone()
16
- return tuple(row) if row else None
17
-