尝试使用 pymssql 连接到数据库时出现 KeyError

Posted

技术标签:

【中文标题】尝试使用 pymssql 连接到数据库时出现 KeyError【英文标题】:KeyError while trying to connect to database using pymssql 【发布时间】:2019-10-21 11:50:43 【问题描述】:

以下代码尝试使用 pymssql 连接到 mssql 数据库。我有一个 CSV 文件,我正在尝试将所有行推送到 mssql 数据库中的单个数据表中。我在打开 CSV 文件后尝试执行代码时收到“KeyError”。

import csv
import pymssql
conn = pymssql.connect(host="host name", 
                       database="dbname", 
                       user = "username",
                       password = "password")

cursor = conn.cursor()
if(conn):
    print("True")
else:
    print("False")

with open ('path to csv file', 'r') as f:
    reader = csv.reader(f)
    columns = next(reader) 
    query = "INSERT INTO Marketing('URL', 'Domain_name', 'Downloadables', 'Text_without_javascript', 'Downloadable_Link') VALUES (%s,%s,%s,%s,%s)"
    query = query.format(','.join('[' + x + ']' for x in columns), ','.join('?' * len(columns)))
    cursor = conn.cursor()
    for data in reader:
        cursor.execute(query, tuple(data))
    cursor.commit()

以下是我得到的错误:

KeyError: "'URL', 'Domain_name', 'Downloadables', 'Text_without_javascript', 'Downloadable_Link'"

使用 to_sql

file_path = "path to csv"
engine = create_engine("mssql://user:password@host/database") 

df = pd.read_csv(file_path, encoding  = 'latin')
df.to_sql(name='Marketing',con=engine,if_exists='append')

输出:

InterfaceError: (pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')

【问题讨论】:

是python错误堆栈中的错误吗?你能更新更多 Python 抛出的错误吗?谢谢。 我最初的想法是你试图抛出一个元组。尝试一个列表。 另外,我们需要处理您的 data in reader for 循环。您在哪里将值分配给query。我没看到。 查询似乎有点不必要的复杂?尝试将查询行移动到 for 循环中,使用 query = f"INSERT INTO TABLE ('URL', 'Domain_name', 'Downloadables', 'Text_without_javascript', 'Downloadable_Link') VALUES (data[0]);"此外,如果 csv 不大,使用 pd.to_sql 会容易得多。 对于 pyodbc,您将需要 wiki github.com/mkleehammer/pyodbc/wiki/… 中描述的驱动程序参数。上面的查询字符串有帮助吗? 【参考方案1】:

我尝试了一切,从将传递的参数转换为元组,按原样传递,但没有帮助。以下是帮助我解决问题的代码:

with open ('path to csv file', 'r') as f:
    for row in f:
        reader = csv.reader(f)
#        print(reader)
        columns = next(reader) 
#        print(columns)
        cursor = conn.cursor()
        for data in reader:
#            print(data)
            data = tuple(data)
#            print(data)
            query = ("INSERT INTO Marketing(URL, Domain_name, Downloadables, Text_without_javascript, Downloadable_Link) VALUES (%s,%s,%s,%s,%s)")
            parameters = data
#            query = query.format(','.join('?' * len(columns)))
            cursor.execute(query, parameters)
        conn.commit()

注意:连接到数据库部分仍然与问题相同。

【讨论】:

以上是关于尝试使用 pymssql 连接到数据库时出现 KeyError的主要内容,如果未能解决你的问题,请参考以下文章

调用 pymssql.connect 时出现“类型‘NoneType’不可迭代”错误

尝试使用 SQLWorkbench 连接到 Amazon Redshift 时出现操作超时错误

尝试使用 mysqli 连接到数据库时出现 Codeigniter 错误

使用加密连接连接到数据源时出现 Power Query 错误

尝试连接到数据库时出现奇怪的错误

尝试连接到 localhost phpmyadmin 时出现错误