@@ -29,6 +29,7 @@ class Cursor:
29
29
30
30
def __init__ (self ) -> None :
31
31
self ._df : DataFrame | None = None
32
+ self ._rows : list [Row ] | None = None
32
33
33
34
def __enter__ (self ) -> Cursor :
34
35
return self
@@ -84,6 +85,7 @@ def close(self) -> None:
84
85
https://github.com/mkleehammer/pyodbc/wiki/Cursor#close
85
86
"""
86
87
self ._df = None
88
+ self ._rows = None
87
89
88
90
def execute (self , sql : str , * parameters : Any ) -> None :
89
91
"""
@@ -112,24 +114,22 @@ def execute(self, sql: str, *parameters: Any) -> None:
112
114
spark_session = SparkSession .builder .getOrCreate ()
113
115
self ._df = spark_session .sql (sql )
114
116
115
- def fetchall (self ) -> list [Row ]:
117
+ def fetchall (self ) -> list [Row ] | None :
116
118
"""
117
119
Fetch all data.
118
120
119
121
Returns
120
122
-------
121
- out : list[Row]
123
+ out : list[Row] | None
122
124
The rows.
123
125
124
126
Source
125
127
------
126
128
https://github.com/mkleehammer/pyodbc/wiki/Cursor#fetchall
127
129
"""
128
- if self ._df is None :
129
- rows = list ()
130
- else :
131
- rows = self ._df .collect ()
132
- return rows
130
+ if self ._rows is None and self ._df is not None :
131
+ self ._rows = self ._df .collect ()
132
+ return self ._rows
133
133
134
134
def fetchone (self ) -> Row | None :
135
135
"""
@@ -144,10 +144,17 @@ def fetchone(self) -> Row | None:
144
144
------
145
145
https://github.com/mkleehammer/pyodbc/wiki/Cursor#fetchone
146
146
"""
147
- if self ._df is None :
148
- row = None
147
+ if self ._rows is None and self ._df is not None :
148
+ self ._rows = self ._df .collect ()
149
+
150
+ if self ._rows is not None :
151
+ try :
152
+ row = self ._rows .pop (0 )
153
+ except IndexError :
154
+ row = None
149
155
else :
150
- row = self ._df .first ()
156
+ row = None
157
+
151
158
return row
152
159
153
160
0 commit comments