47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
#------------------------------------------------------------------------------
|
|
# Copyright (c) 2016, 2021, Oracle and/or its affiliates. All rights reserved.
|
|
#------------------------------------------------------------------------------
|
|
|
|
#------------------------------------------------------------------------------
|
|
# generic_row_factory.py
|
|
#
|
|
# Demonstrate the ability to return named tuples for all queries using a
|
|
# subclassed cursor and row factory.
|
|
#------------------------------------------------------------------------------
|
|
|
|
import collections
|
|
import cx_Oracle as oracledb
|
|
import sample_env
|
|
|
|
class Connection(oracledb.Connection):
|
|
|
|
def cursor(self):
|
|
return Cursor(self)
|
|
|
|
|
|
class Cursor(oracledb.Cursor):
|
|
|
|
def execute(self, statement, args = None):
|
|
prepare_needed = (self.statement != statement)
|
|
result = super().execute(statement, args or [])
|
|
if prepare_needed:
|
|
description = self.description
|
|
if description is not None:
|
|
names = [d[0] for d in description]
|
|
self.rowfactory = collections.namedtuple("GenericQuery", names)
|
|
return result
|
|
|
|
|
|
# create new subclassed connection and cursor
|
|
connection = Connection(sample_env.get_main_connect_string())
|
|
cursor = connection.cursor()
|
|
|
|
# the names are now available directly for each query executed
|
|
for row in cursor.execute("select ParentId, Description from ParentTable"):
|
|
print(row.PARENTID, "->", row.DESCRIPTION)
|
|
print()
|
|
|
|
for row in cursor.execute("select ChildId, Description from ChildTable"):
|
|
print(row.CHILDID, "->", row.DESCRIPTION)
|
|
print()
|