使用 Python 在 MS Access 中传输数据

Posted

技术标签:

【中文标题】使用 Python 在 MS Access 中传输数据【英文标题】:Transfering Data in MS Access Using Python 【发布时间】:2021-07-27 12:24:26 【问题描述】:

我有一个不断增长和变化的数据库,它反映了州和 EPA 通过的许可。 随着数据库的变化和更新,我需要传输相关信息。

脚本做了两件事;首先它检查哪些字段是相同的,并创建一个字段和数据列表,这些字段和数据将被插入到新数据库中。其次将数据插入到新的数据库中。

问题是我无法插入它。我已经以各种方式匹配了网上所说的所有内容,但出现错误('42000'、'[42000] [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句中的语法错误。(-3502)(SQLExecDirectW)')。

我不知道如何防止它。

代码:

import pyodbc

importDatabase = r"J:\ENVIRO FIELD\AccessDatabases\MS4\MS4 Town Databases\~Template\MS4_Apocalypse Import DEV 1.accdb"

"Create the Import Database Connection"
connectionImport = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=%s;' %(importDatabase))
cursorImport = connectionImport.cursor()


"####---Outfall Section---####"

"Import the outfall names into the new database"

tbl = "tbl_Outfall_1_Profile"

exportList = []
importList = []
for row in cursorImport.columns(table = "tblExportMigration_Outfall_1_Profile"):
    field = row.column_name
    exportList.append(field)

for row in cursorImport.columns(table = "tbl_Outfall_1_Profile"):
    field = row.column_name
    importList.append(field)

matchingList = []
for field in exportList:
    if field != "outfallID":
        if field in importList:
            matchingList.append(field)
    else:
        continue

sqlValue = ""
for field in matchingList:
    sqlValue += "[%s], " %(field)

sqlValue = sqlValue[:-2]
sql = "SELECT %s from %s" %(sqlValue, "tblExportMigration_Outfall_1_Profile")

for rowA in cursorImport.execute(sql):
    tupleList = list(rowA)
    tupleList = ["" if i == None else i for i in tupleList]
    tupleValues = tuple(tupleList)
    sqlUpdate = """INSERT INTO tbl_Outfall_1_Profile (%s) Values %s;""" %(sqlValue, tupleValues)
    cursorImport.execute(sqlUpdate)

cursorImport.close()

这是我创建的 sql 字符串

“插入到 tbl_Outfall_1_Profile([profile_OutfallName]、[profile_HistoricalName1]、[profile_HistoricalName2]、[profile_HistoricalName3]、[profile_HistoricalName4])值('756'、''、''、''、'');”

【问题讨论】:

首先,不要使用字符串替换(“动态 SQL”)来插入列值。请改用正确的参数化查询,例如sqlUpdate = "INSERT INTO tbl_name (⁦col1, col2) Values (?, ?);",后跟cursorImport.execute(sqlUpdate, (param1, param2))。在网络上搜索“小鲍比桌”以获取更多信息。 @GordThompson 我不能将信息硬连接到查询中。我可以创建一段脚本来生成?但是,由于许可证的性质,表格字段名称很有可能被更新和更改。我必须在系统中解决这个问题,否则以后会出现问题。我没有创建也没有写许可证,但我必须让系统反映它。 因此您可能仍需要对列列表使用动态 SQL,因为参数替换仅适用于列 values,而不适用于列 names,但您仍然应该为值使用参数。 @GordThompson 这就是您要执行的操作:sqlUpdate = "INSERT INTO tbl_Outfall_1_Profile ([profile_OutfallName], [profile_HistoricalName1], [profile_HistoricalName2], [profile_HistoricalName3], [profile_HistoricalName4]) 值 (? ,?,?,?,?);" cursorImport.execute(sqlUpdate, (tupleValues)) 就是这样,是的。 【参考方案1】:

按照@Gord Thompson 所说的,我实际上能够创建动态参数流

首先创建了一个模块来创建?

def Defining_Paramters(length):
    parameterString = ""
for x in range(1,length):
    parameterString += "?, "
parameterString += "?"

return parameterString

然后将其插入到 sql 更新的字符串中

sqlUpdate = sqlUpdate = "INSERT INTO %s (%s) Values (%s);" %(table, sqlFrameworkSubStr, parameters)

运行光标并提交

cursorTo.execute(sqlUpdate, (dataTuple))
connectionTo.commit()

您似乎必须完整地创建查询,然后以元组格式输入数据

【讨论】:

【参考方案2】:

这是我创建的 [我认为] sql 字符串

试试这个:

sqlUpdate = """INSERT INTO tbl_Outfall_1_Profile (%s) Values (%s);""" %(sqlValue, tupleValues)

或许:

sqlUpdate = "INSERT INTO tbl_Outfall_1_Profile (%s) Values (%s);" %(sqlValue, tupleValues)

【讨论】:

我试过了,但仍然得到 42000 错误 也许你不能插入空字符串Values ('756', '', '', '', '')。最有可能的是,它们应该是 Null ( cc: @Jake ) - 这将是一个不同的错误:“[HY000] [Microsoft][ODBC Microsoft Access Driver] 字段 'Donor.DonorName' 不能是零长度字符串。( -3702) (SQLExecDirectW)"

以上是关于使用 Python 在 MS Access 中传输数据的主要内容,如果未能解决你的问题,请参考以下文章

Ms-Access 尝试使用“传输文本”创建具有唯一文件名的 csv 文件

如何通过 Python 3.5.1 创建永久 MS Access Query?

将数据从 MS Access 传输到 SQL Server

每次从 MS Access 发生任何更改时,将数据从 MS Access 数据库传输到 Mysql 数据库[关闭]

使用 Python 从 MS Access 中提取数据

在 Python 中连接到 MS Access