oracle / python-oracledb

Python driver for Oracle Database conforming to the Python DB API 2.0 specification. This is the renamed, new major release of cx_Oracle
https://oracle.github.io/python-oracledb
Other
308 stars 61 forks source link

cx_oracle allows me to insert pyodbc.row object or objects in executemany() and execute. oracledb does not! #205

Closed hl1 closed 10 months ago

hl1 commented 11 months ago
  1. What versions are you using?

V.1.3.1 on windows and linux

  1. Is it an error or a hang or a crash?

error

  1. What error(s) or behavior you are seeing?

DPY-2004: "parameters" argument should be a list of sequences or dictionaries, or an integer specifying the number of times to execute the statement

  1. Does your application call init_oracle_client()? does not work regardless if it is thin or thick mode.

  2. Include a runnable Python script that shows the problem.

    
    import pyodbc
    cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')
    cursor = cnxn.cursor()
    cursor.execute("SELECT 1, 2 UNION SELECT 3, 4")
    results = cursor.fetchall()

with oracledb.connect(user=un, password=pw, dsn=cs) as connection: with connection.cursor() as oracle_cursor: oracle_cursor.executemany("insert into ParentTable values (:1, :2)", results)

I get the following error on the last line:
```DPY-2004: "parameters" argument should be a list of sequences or dictionaries, or an integer specifying the number of times to execute the statement```

more info:

type(results) -- returns <class 'list'> type(results[0]) -- return <class 'pyodbc.Row'>



This works with no problem in cx_oracle!
hl1 commented 11 months ago

workaround for those encountering similar issues is to convert pyodbc rows into regular list:

results = [list(row) for row in cursor.fetchall())]

but I am not looking for a workaround, I need a solution for this as pyodbc.rows are more powerful than a regular list. and converting a huge stack of code to the workaround above should be temporary and not the final solution.

anthony-tuininga commented 11 months ago

I have pushed a patch that should correct this issue. If you are able to build from source you can verify that it corrects your issue as well.

SmileyMan commented 10 months ago

results = [list(row) for row in cursor.fetchall())]

Thank you. Just changing from cx_Oracle to oracledb and hit the same issue.

hl1 commented 10 months ago

I have pushed a patch that should correct this issue. If you are able to build from source you can verify that it corrects your issue as well.

I am not able to build from source but will be waiting on this to be released in future oracledb version

anthony-tuininga commented 10 months ago

This has been included in python-oracledb 1.4.0 which was just released.