将行从 df 插入到 MS 访问错误 "number of query values and destination fields are not the same"
Inserting rows from df to MS Access Error "number of query values and destination fields are not the same"
我有一个名为 df2 的数据框,其中包含以下列:
IN: df2.columns
Out:
Index(['Section Names', 'Job Code', 'Job Title', 'Footnotes', 'Rates',
'Wage Determination', 'Revision Date', 'Revision Number'],
dtype='object')
我把它算作 8 列。
我已将列名保存到 cols:
IN: cols = "','".join([str(i) for i in df2.columns.tolist()])
IN: print(cols)
OUT: Section Names','Job Code','Job Title','Footnotes','Rates','Wage Determination','Revision Date','Revision Number
同样,我看到了 8 列。
并且,在 Access 中,我有一个 table 包含这些列(none 目前已指定为主键):
Section Name
Job Code
Job Title
Footnotes
Rates
Wage Determination
Revision Date
Revision Number
这是 8 列。我尝试执行此代码以使用来自 df2:
的数据填充 test_table
for i, row in df2.iterrows():
sql = "INSERT INTO `test_table` (`" +cols + "`) VALUES (?,?,?,?,?,?,?,?)"
cursor.execute(sql, tuple(row))
conn.commit()
但我收到此错误:
Error: ('21S01', '[21S01] [Microsoft][ODBC Microsoft Access Driver] Number of query values and destination fields are not the same. (-3520) (SQLExecDirectW)')
我以为是因为它试图插入索引,并且在读取 csv 文件(分配给 df2)时做了 index_col = 0
。但是,这将列数减少了 1,我相应地调整了 sql 语句中的 cols 值和 VALUES
,但我遇到了同样的错误。
有什么想法吗? TIA.
EDIT 我认为这可能是数据类型问题。我将 Access 中的所有数据类型更改为 'short text' 并将 df2
中的数据类型更改为对象。还是一样的错误。
在 MS Access 中,您需要在方括号或反引号 table 或列名中加入空格 and/or 特殊字符。现在,您在 str.join
中使用单引号,但随后在 SQL 语句中使用反引号。简单地说,在两个字符串中使用反引号或方括号:
# DELIMIT WITH BACK TICKS
cols = "`, `".join(i for i in df2.columns)
qmarks = ", ".join('?' for _ in df2.columns)
# USING F-STRING
sql = f"INSERT INTO `test_table` (`{cols}`) VALUES ({qmarks})"
for i, row in df2.iterrows():
cursor.execute(sql, tuple(row))
conn.commit()
甚至考虑 executemany
:
cols = "`, `".join(i for i in df2.columns)
qmarks = ", ".join('?' for _ in df2.columns)
sql = f"INSERT INTO `test_table` (`{cols}`) VALUES ({qmarks})"
vals = df2.to_numpy().tolist()
cursor.executemany(sql, vals)
conn.commit()
我有一个名为 df2 的数据框,其中包含以下列:
IN: df2.columns
Out:
Index(['Section Names', 'Job Code', 'Job Title', 'Footnotes', 'Rates',
'Wage Determination', 'Revision Date', 'Revision Number'],
dtype='object')
我把它算作 8 列。
我已将列名保存到 cols:
IN: cols = "','".join([str(i) for i in df2.columns.tolist()])
IN: print(cols)
OUT: Section Names','Job Code','Job Title','Footnotes','Rates','Wage Determination','Revision Date','Revision Number
同样,我看到了 8 列。
并且,在 Access 中,我有一个 table 包含这些列(none 目前已指定为主键):
Section Name
Job Code
Job Title
Footnotes
Rates
Wage Determination
Revision Date
Revision Number
这是 8 列。我尝试执行此代码以使用来自 df2:
的数据填充 test_tablefor i, row in df2.iterrows():
sql = "INSERT INTO `test_table` (`" +cols + "`) VALUES (?,?,?,?,?,?,?,?)"
cursor.execute(sql, tuple(row))
conn.commit()
但我收到此错误:
Error: ('21S01', '[21S01] [Microsoft][ODBC Microsoft Access Driver] Number of query values and destination fields are not the same. (-3520) (SQLExecDirectW)')
我以为是因为它试图插入索引,并且在读取 csv 文件(分配给 df2)时做了 index_col = 0
。但是,这将列数减少了 1,我相应地调整了 sql 语句中的 cols 值和 VALUES
,但我遇到了同样的错误。
有什么想法吗? TIA.
EDIT 我认为这可能是数据类型问题。我将 Access 中的所有数据类型更改为 'short text' 并将 df2
中的数据类型更改为对象。还是一样的错误。
在 MS Access 中,您需要在方括号或反引号 table 或列名中加入空格 and/or 特殊字符。现在,您在 str.join
中使用单引号,但随后在 SQL 语句中使用反引号。简单地说,在两个字符串中使用反引号或方括号:
# DELIMIT WITH BACK TICKS
cols = "`, `".join(i for i in df2.columns)
qmarks = ", ".join('?' for _ in df2.columns)
# USING F-STRING
sql = f"INSERT INTO `test_table` (`{cols}`) VALUES ({qmarks})"
for i, row in df2.iterrows():
cursor.execute(sql, tuple(row))
conn.commit()
甚至考虑 executemany
:
cols = "`, `".join(i for i in df2.columns)
qmarks = ", ".join('?' for _ in df2.columns)
sql = f"INSERT INTO `test_table` (`{cols}`) VALUES ({qmarks})"
vals = df2.to_numpy().tolist()
cursor.executemany(sql, vals)
conn.commit()