cx_ Oracle .NotSupportedError: Python значение типа pyodb c .Row не поддерживается - PullRequest
0 голосов
/ 05 мая 2020

Когда я хочу сделать ETL с сервера SQL на Oracle, я использую приведенный ниже код. На самом деле я использовал процесс и поток, но мой код выдает ошибку. После выполнения ошибка cx_Oracle.NotSupportedError: Python value of type pyodbc.Row not supported. Вы можете мне помочь?

import cx_Oracle
import sys
import pyodbc

BYTES_PER_BATCH = 1024 *256  

# Oracle connection
connection_12c=cx_Oracle.connect()
cur_12c = connection_12c.cursor()
# SQL Server Connection
conn_str = (
        'DRIVER={driver;'
        'SERVER=IP:PORT;'
        'DATABASE=DBNAME;'
        'UID=user;'
        'PWD=pass'
    )
cnxn = pyodbc.connect(conn_str)
cur = cnxn.cursor()
query = """SELECT Id, OpTime,  GidenData , Action FROM table """
cur.execute(query)
    # Id number
    # Optime Datetime
    # gidendata clob
cur_batch = []
cur_size = 0
for result in cur.fetchall():
    cur_batch.append(result)
    cur_size += sys.getsizeof(result)
    if cur_size > BYTES_PER_BATCH:
        cur_12c.execute("""insert into oracle_table (Id,OpTime,GidenData,Action) values (: 1  ,: 2  ,: 3  ,: 4 ) """,cur_batch)
        cur_batch = []
        cur_size = 0

1 Ответ

0 голосов
/ 08 мая 2020

В вашем коде вы создаете пакет строк, но затем вызываете cursor.execute (), который вставляет только одну строку! Поскольку Oracle также поддерживает PL / SQL с массивами данных, cx_ Oracle предполагает, что вы передаете массив объектов pyodb c .Row, с которыми он не знает, что делать. Вместо этого вам просто нужно заменить cur_12 c .execute () на cur_12 c .executemany (). Затем cx_ Oracle обработает массив строк - я считаю, что вы хотите.

import cx_Oracle
import sys
import pyodbc

BYTES_PER_BATCH = 1024 *256  

# Oracle connection
connection_12c=cx_Oracle.connect()
cur_12c = connection_12c.cursor()
# SQL Server Connection
conn_str = (
        'DRIVER={driver;'
        'SERVER=IP:PORT;'
        'DATABASE=DBNAME;'
        'UID=user;'
        'PWD=pass'
    )
cnxn = pyodbc.connect(conn_str)
cur = cnxn.cursor()
query = """SELECT Id, OpTime,  GidenData , Action FROM table """
cur.execute(query)
    # Id number
    # Optime Datetime
    # gidendata clob
cur_batch = []
cur_size = 0
for result in cur.fetchall():
    cur_batch.append(result)
    cur_size += sys.getsizeof(result)
    if cur_size > BYTES_PER_BATCH:
        cur_12c.executemany("""insert into oracle_table (Id,OpTime,GidenData,Action) values (: 1  ,: 2  ,: 3  ,: 4 ) """,cur_batch)
        cur_batch = []
        cur_size = 0
...