【问题标题】:Python "InterfaceError: Error binding parameter 2 - probably unsupported type."Python“InterfaceError:错误绑定参数 2 - 可能是不受支持的类型。”
【发布时间】:2016-02-04 08:20:12
【问题描述】:

当我运行以下代码时,我不断收到“InterfaceError:错误绑定参数 2 - 可能不受支持的类型”错误,我需要帮助确定问题所在。在我尝试将数据发送到 sql 之前,一切正常。

anagramsdf.to_sql('anagrams',con=conn,if_exists='replace',index=False)
cdf=pd.read_sql("select (distinct ID) from anagrams;",conn)

import pandas as pd
import sqlite3

conn = sqlite3.connect("anagrams")
xsorted=sorted(anagrams,key=sorted)
xunique=[x[0] for x in anagrams]

xunique=pd.Series(xunique)
xanagrams=pd.Series(anagrams)
anagramsdf=pd.concat([xunique,dfcount,xanagrams],axis=1)
anagramsdf.columns=['ID','anagram_count','anagram_list']

c=conn.cursor()
c.execute("create table anagrams(ID, anagram_count, anagram_list)")
conn.commit()

anagramsdf.to_sql('anagrams',con=conn,if_exists='replace',index=False)
cdf=pd.read_sql("select (distinct ID) from anagrams;",conn)

cdf=pd.read_sql("select max(anagram_count) from anagrams;",conn)
cdf
def print_full(x):
    pd.set_option('display.max_rows', len(x))
    print(x)
    pd.reset_option('display.max_rows')

cdf=pd.read_sql("select * from anagrams where anagram_count=12;",conn)
pd.set_option('max_colwidth',200)

完整的回溯错误:

Traceback (most recent call last):
  File "sqlpandas.py", line 88, in <module>
    anagramsdf.to_sql('anagrams',con=conn,if_exists='replace',index=False)
  File "/Users/andrewclark/anaconda/lib/python2.7/site-packages/pandas/core/generic.py", line 982, in to_sql
    dtype=dtype)
  File "/Users/andrewclark/anaconda/lib/python2.7/site-packages/pandas/io/sql.py", line 549, in to_sql
    chunksize=chunksize, dtype=dtype)
  File "/Users/andrewclark/anaconda/lib/python2.7/site-packages/pandas/io/sql.py", line 1567, in to_sql
    table.insert(chunksize)
  File "/Users/andrewclark/anaconda/lib/python2.7/site-packages/pandas/io/sql.py", line 728, in insert
    self._execute_insert(conn, keys, chunk_iter)
  File "/Users/andrewclark/anaconda/lib/python2.7/site-packages/pandas/io/sql.py", line 1357, in _execute_insert
    conn.executemany(self.insert_statement(), data_list)
sqlite3.InterfaceError: Error binding parameter 2 - probably unsupported type.

来自数据框的片段:

             ID  anagram_count           anagram_list
0            aa              1                  (aa,)
1      anabaena              1            (anabaena,)
2      baaskaap              1            (baaskaap,)
3      caracara              1            (caracara,)
4      caragana              1            (caragana,)

【问题讨论】:

  • 你能把这个例子减少到几行吗?所有带有urllibitertoolsprint 语句等的代码都没有添加任何有用的东西。见How to create a Minimal, Complete, and Verifiable example
  • 另外,根据引发错误的行,这可能是pandas 的问题,并且该问题需要适当的标记。
  • 请添加完整的错误回溯!
  • 你能显示anagramsdf.info()吗?或者理想情况下,制作一个可重现的示例来组成数据框。
  • anagram_list 列包含元组,sqlite 不支持将其插入数据帧。因此,将其转换为字符串即可解决问题。

标签: python sql sqlite pandas


【解决方案1】:

Sparrow 的解决方案对我有用。如果索引未转换为日期时间,则 SQL 将抛出“错误绑定参数”

我使用具有日期时间的列首先转换为正确的格式,然后将其用作索引:

df.set_index(pd.to_datetime(df['datetime']), inplace=True) 

【讨论】:

    【解决方案2】:

    使用 Pandas 0.23.4 我有一列包含日期时间值(格式 '%Y-%m-%d %H:%M:%S'),它的数据类型为“字符串”,它引发了相同的错误当我试图将它传递给“to_sql”方法时。转换为“日期时间”dtype 后,它起作用了。希望这对有同样问题的人有所帮助:)。

    转换:

    df['date'] = pd.to_datetime(df['date'],format=datetimeFormat,errors='coerce')
    

    【讨论】:

      【解决方案3】:

      我使用以下代码将数据类型更改为字符串,这解决了问题:

      anagramsdf.dtypes
      anagramsdf['ID']= anagramsdf['ID'].astype('str')
      anagramsdf['anagram_list']= anagramsdf['anagram_list'].astype('str')
      anagramsdf.to_sql('anagramsdf',con=conn,if_exists='append',index=False)
      

      【讨论】:

      • anagram_list 列包含元组,sqlite 不支持将其插入数据帧。因此,将其转换为字符串即可解决问题。
      • 谢谢joris的解释!
      猜你喜欢
      • 2020-02-24
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多