使用Pyodb插入2003 MDB文件时出现语法错误

2024-05-03 02:58:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从头开始编写2003 mdb文件。我已经有了一个包含表和列名的文件(我有112列)。在我的尝试中,我从pandas数据帧(代码中命名的部分)中读取行,并将这些行附加到mdb文件中。但是,在使用pyodbc INSERT-INTO语法时,它给了我以下错误:

ProgrammingError: ('42000', "[42000] [Microsoft][Driver ODBC Microsoft Access] Expression syntax error 'Equatorial-TB-BG-CA_IRI-1.0_SNP-1.0_ACA-0_ESAL-1000'. (-3100) (SQLExecDirectW)")

这是我的密码:

for k in range(len(sections)):
    cols = tuple(list(sections.columns))
    vals = tuple(list(sections.iloc[k]))
    action = 'INSERT INTO SECTIONS {columns} VALUES {values}'.format(columns = str(cols).replace("'",""), values = str(vals).replace("'",""))
    cursor.execute(action)
    conn.commit()

有人知道我为什么会有这样的问题吗


Tags: columns文件actionreplacemicrosoftlistinsertvalues
1条回答
网友
1楼 · 发布于 2024-05-03 02:58:01

实际上,这不是一个特定于访问的错误,而是一个一般的SQL错误,其中字符串没有正确地用引号括起来。因此,访问引擎假定它们是命名字段,而引擎假定您运行的是减法表达式,因此连字符使这些字段更加复杂

要演示这个问题,请参见下面的“填写未知值”。注意,VALUES中传递的字符串项没有被引用:

sections_columns = ['database', 'tool']
cols = tuple(list(sections_columns))

sections_vals = ['ms-access', 'pandas']
vals = tuple(list(sections_vals))

action = 'INSERT INTO SECTIONS {columns} VALUES {values}'.\
          format(columns = str(cols).replace("'",""), values = str(vals).replace("'",""))

print(action)
# INSERT INTO SECTIONS (database, tool) VALUES (ms-access, pandas)

现在,您可以在str(vals)中替换单引号:

action = 'INSERT INTO SECTIONS {columns} VALUES {values}'.\
          format(columns = str(cols).replace("'",""), values = str(vals))

print(action)
# INSERT INTO SECTIONS (database, tool) VALUES ('ms-access', 'pandas')

但更好的是,考虑使用qmark占位符参数化查询并将值作为参数传递(第二个参数是cursor.execute(query, params))。这样可以避免引用或取消引用字符串或数值:

# MOVED OUTSIDE LOOP AS UNCHANGING OBJECTS
cols = tuple(sections.columns)            # REMOVED UNNEEDED list()
qmarks = tuple(['?' for i in cols])       # NEW OBJECT

action = 'INSERT INTO SECTIONS {columns} VALUES {qmarks}'.\
          format(columns = str(cols).replace("'",""), qmarks = str(qmarks))
# INSERT INTO SECTIONS (col1, col2, col3, ...) VALUES (?, ?, ?...)

for k in range(len(sections)):        
    vals = list(sections.iloc[k])         # REMOVED tuple()

    cursor.execute(action, vals)          # EXECUTE PARAMETERIZED QUERY
    conn.commit()

更妙的是,使用准备好的语句避免任何executemanyDataFrame.values.tolist()的循环:

# PREPARED STATEMENT
cols = tuple(sections.columns)
qmarks = tuple(['?' for i in cols])

action = 'INSERT INTO SECTIONS {columns} VALUES {qmarks}'.\
          format(columns = str(cols).replace("'",""), qmarks = str(qmarks))

# EXECUTE PARAMETERIZED QUERY
cursor.executemany(action, sections.values.tolist())   
conn.commit()

相关问题 更多 >