self,
cur: BaseCursor[ConnectionType],
query: Query,
- scrollable: bool,
+ scrollable: Optional[bool],
hold: bool,
) -> sql.Composable:
+
if isinstance(query, bytes):
query = query.decode(cur._conn.client_encoding)
if not isinstance(query, sql.Composable):
query = sql.SQL(query)
- return sql.SQL(
- "declare {name} {scroll} cursor{hold} for {query}"
- ).format(
- name=sql.Identifier(self.name),
- scroll=sql.SQL("scroll" if scrollable else "no scroll"),
- hold=sql.SQL(" with hold" if hold else ""),
- query=query,
- )
+ parts = [
+ sql.SQL("declare"),
+ sql.Identifier(self.name),
+ ]
+ if scrollable is not None:
+ parts.append(sql.SQL("scroll" if scrollable else "no scroll"))
+ parts.append(sql.SQL("cursor"))
+ if hold:
+ parts.append(sql.SQL("with hold"))
+ parts.append(sql.SQL("for"))
+ parts.append(query)
+
+ return sql.SQL(" ").join(parts)
class ServerCursor(BaseCursor["Connection"]):
query: Query,
params: Optional[Params] = None,
*,
- scrollable: bool = True,
+ scrollable: Optional[bool] = None,
hold: bool = False,
) -> "ServerCursor":
"""
query: Query,
params: Optional[Params] = None,
*,
- scrollable: bool = True,
+ scrollable: Optional[bool] = None,
hold: bool = False,
) -> "AsyncServerCursor":
query = self._helper._make_declare_statement(
with pytest.raises(e.ProgrammingError):
cur.scroll(0)
- cur.execute("select generate_series(0,9)")
+ cur.execute("select generate_series(0,9)", scrollable=True)
cur.scroll(2)
assert cur.fetchone() == (2,)
cur.scroll(2)
def test_scrollable(conn):
curs = conn.cursor("foo")
- curs.execute("select generate_series(0, 5)")
+ curs.execute("select generate_series(0, 5)", scrollable=True)
curs.scroll(5)
for i in range(4, -1, -1):
curs.scroll(-1)
with pytest.raises(e.ProgrammingError):
await cur.scroll(0)
- await cur.execute("select generate_series(0,9)")
+ await cur.execute("select generate_series(0,9)", scrollable=True)
await cur.scroll(2)
assert await cur.fetchone() == (2,)
await cur.scroll(2)
async def test_scrollable(aconn):
curs = aconn.cursor("foo")
- await curs.execute("select generate_series(0, 5)")
+ await curs.execute("select generate_series(0, 5)", scrollable=True)
await curs.scroll(5)
for i in range(4, -1, -1):
await curs.scroll(-1)