【问题标题】:Oracle db in Python: missing commaPython 中的 Oracle 数据库:缺少逗号
【发布时间】:2025-12-11 13:05:01
【问题描述】:

我正在尝试使用 Oracle 插入表中。我收到“缺少逗号”错误。有什么问题? 编辑: res 是一个数值 edit2:我想通了并更改了代码

with io.open(path, encoding='utf-8') as f:
    reader = csv.reader(f, delimiter=';')
    first = True
    for r in reader:
        if first:
            first = False
            continue
        res = clearNumber(r[4])
        cursor.execute("INSERT INTO PHONES(name, phnumber, phnumber_int) VALUES(:name, :phnumber, :phnumber_int)", [r[3], r[4], res])
        conn.commit()

【问题讨论】:

  • 您使用的是什么 Oracle 驱动程序?这是传递绑定值的方式吗?我对此表示怀疑。你能在 PHONES 中插入一行吗?
  • 从文档中,一个例子: cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", (42, 'bar')) - 你的问题是您的变量是字符串的一部分,而不是变量的值。编辑:对不起,这是 postgreSQL - 所以这里可能不一样
  • 我想使用占位符。我以前只使用过 SQLite,每个示例中都有 :var。
  • :var 是正确的,但请提供有关您收到的错误消息的其他信息,列名称、phnumber 和 phnumber_int 的类型以及 r[3]、r 中的值是什么[4] 和资源。

标签: python sql oracle cx-oracle


【解决方案1】:

为什么不使用现有的工具来完成这项工作?

  • SQL*Loader(大约 40 年前构建)
  • 外部表(将文件操作为表)
  • csv2db(比较新的工具,支持多个RDBMS)
  • Elasticsearch Logstash(很棒的工具)

csv2db 演示

$echo 'drop user csvdata cascade;' | sqlplus -S system/oracle@localhost:1521/XEPDB1

User dropped.

Elapsed: 00:00:01.07
$sqlplus -S system/oracle@localhost:1521/XEPDB1 <<EOF
create user csvdata identified by load default tablespace USERS temporary tablespace TEMP quota unlimited on USERS;
grant create session, resource to csvdata;
EOF

User created.

Elapsed: 00:00:00.06

Grant succeeded.

Elapsed: 00:00:00.01

# https://github.com/csv2db/csv2db
$csv2db generate --file=movies.csv --table=MOVIES | sed 's/1000/4000/' \
| sqlplus -S csvdata/load@localhost:1521/XEPDB1

Table created.

Elapsed: 00:00:00.02
$time csv2db load --user=csvdata --password=load --host=localhost --port=1521 --dbname=XEPDB1 \
       --separator=',' --table=MOVIES --directpath \
       --file=movies.csv

Loading file movies.csv
File loaded.


real    0m3.193s
user    0m1.201s
sys     0m0.422s

$echo 'select count(*) from movies;' | sqlplus -S csvdata/load@localhost:1521/XEPDB1

  COUNT(*)
----------
     76086

Elapsed: 00:00:00.17

祝你好运!

【讨论】:

  • 我需要它是一个可以连接到确切的 oracle 云数据库的 python 程序