50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
#------------------------------------------------------------------------------
|
|
# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
|
|
#------------------------------------------------------------------------------
|
|
|
|
#------------------------------------------------------------------------------
|
|
# query_strings_as_bytes.py
|
|
#
|
|
# Demonstrates how to query strings as bytes (bypassing decoding of the bytes
|
|
# into a Python string). This can be useful when attempting to fetch data that
|
|
# was stored in the database in the wrong encoding.
|
|
#
|
|
# This script requires cx_Oracle 8.2 and higher.
|
|
#------------------------------------------------------------------------------
|
|
|
|
import cx_Oracle as oracledb
|
|
import sample_env
|
|
|
|
STRING_VAL = 'I bought a cafetière on the Champs-Élysées'
|
|
|
|
def return_strings_as_bytes(cursor, name, default_type, size, precision,
|
|
scale):
|
|
if default_type == oracledb.DB_TYPE_VARCHAR:
|
|
return cursor.var(str, arraysize=cursor.arraysize, bypass_decode=True)
|
|
|
|
with oracledb.connect(sample_env.get_main_connect_string()) as conn:
|
|
|
|
# truncate table and populate with our data of choice
|
|
with conn.cursor() as cursor:
|
|
cursor.execute("truncate table TestTempTable")
|
|
cursor.execute("insert into TestTempTable values (1, :val)",
|
|
val=STRING_VAL)
|
|
conn.commit()
|
|
|
|
# fetch the data normally and show that it is returned as a string
|
|
with conn.cursor() as cursor:
|
|
cursor.execute("select IntCol, StringCol from TestTempTable")
|
|
print("Data fetched using normal technique:")
|
|
for row in cursor:
|
|
print(row)
|
|
print()
|
|
|
|
# fetch the data, bypassing the decode and show that it is returned as
|
|
# bytes
|
|
with conn.cursor() as cursor:
|
|
cursor.outputtypehandler = return_strings_as_bytes
|
|
cursor.execute("select IntCol, StringCol from TestTempTable")
|
|
print("Data fetched using bypass decode technique:")
|
|
for row in cursor:
|
|
print(row)
|