Pandas to_sql TypeError 不支持的操作数类型
Pandas to_sql TypeError unsupported operand type
我正在使用 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
我的数据库 table 定义了完全相同的列名。
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,指出操作模式 +“。” + 名称不支持 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 或 name 会导致问题,因为所有列名显然都是字符串。感谢任何帮助。
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')
我正在使用 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
我的数据库 table 定义了完全相同的列名。
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,指出操作模式 +“。” + 名称不支持 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 或 name 会导致问题,因为所有列名显然都是字符串。感谢任何帮助。
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')