【问题标题】:Pandas to_sql TypeError unsupported operand typePandas to_sql TypeError 不支持的操作数类型
【发布时间】:2021-05-23 22:37:28
【问题描述】:

我正在使用 Pandas to_sql 进行数据库插入,以将数百万行移动到 sqlalchemy。我创建了一个只有 4 行的小型测试 csv,以便我确切知道文件中的数据。

这里是csv格式

column_one,column_two,column_three,column_four
0001-1234,db38ad21b3,https://example.com,2
0034-1201,38db21adb3,https://example-two.com,3

我的数据库表是用完全相同的列名定义的。

df = pd.read_csv("test_repositories.csv", 
        header=0, 
        sep=',',
        quotechar='"',
        dtype={'column_one': str,
            'column_two': str,
            'column_three': str,
            'column_four': int},
            error_bad_lines=False)
df = df.where(pd.notnull(df), None)
df.to_sql(self.staging_table, db.engine, self.chunksize, method='multi')

这似乎应该可以工作,但是我不断收到以下 TypeError 说操作模式 +“。” + name 不支持 str + int

  File "/ingest/utils.py", line 59, in copy_csv_to_temp_table
    df.to_sql(self.staging_table, db.engine, self.chunksize, method='multi')
  File "/venv/lib/python3.8/site-packages/pandas/core/generic.py", line 2776, in to_sql
    sql.to_sql(
  File "/venv/lib/python3.8/site-packages/pandas/io/sql.py", line 590, in to_sql
    pandas_sql.to_sql(
  File "/venv/lib/python3.8/site-packages/pandas/io/sql.py", line 1382, in to_sql
    table = SQLTable(
  File "/venv/lib/python3.8/site-packages/pandas/io/sql.py", line 700, in __init__
    self.table = self._create_table_setup()
  File "/venv/lib/python3.8/site-packages/pandas/io/sql.py", line 966, in _create_table_setup
    return Table(self.name, meta, *columns, schema=schema)
  File "<string>", line 2, in __new__
  File "/venv/lib/python3.8/site-packages/sqlalchemy/util/deprecations.py", line 139, in warned
    return fn(*args, **kwargs)
  File "/venv/lib/python3.8/site-packages/sqlalchemy/sql/schema.py", line 537, in __new__
    key = _get_table_key(name, schema)
  File "/venv/lib/python3.8/site-packages/sqlalchemy/sql/schema.py", line 77, in _get_table_key
    return schema + "." + name
TypeError: unsupported operand type(s) for +: 'int' and 'str'

我了解此错误的含义。但是,我不明白为什么模式或名称会导致问题,因为所有列名显然都是字符串。任何帮助表示赞赏。

【问题讨论】:

  • schema 是第三个位置参数,默认为无,但你提供它:df.to_sql(self.staging_table, db.engine, self.chunksize, method='multi') 尝试将 chunksize 设为命名参数:df.to_sql(self.staging_table, db.engine, chunksize=self.chunksize, method='multi') - 可能会这样做
  • @JonClements 你太棒了。谢谢,这正是问题所在。

标签: python-3.x pandas sqlalchemy typeerror pandas-to-sql


【解决方案1】:

function signature 是:

DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)

请注意,schema 是第三个位置参数,默认为 None。

因此通过使用:

df.to_sql(self.staging_table, db.engine, self.chunksize, method='multi')

您认为 chunksize 被解释为 schema 参数,因此将您的 chunksize 更改为显式命名,例如:

df.to_sql(self.staging_table, db.engine, chunksize=self.chunksize, method='multi')

【讨论】:

    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2011-03-08
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多