Pandas to_sql TypeError неподдерживаемый тип операнда

Я делаю вставку в базу данных, используя Pandas to_sql, чтобы переместить миллионы строк в sqlalchemy. Я создал небольшой тестовый CSV-файл всего с 4 строками, чтобы точно знать, какие данные находятся в файле.

Вот формат 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, говорящую о том, что схема операции + . + имя не может поддерживать 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'

Я понимаю, что означает эта ошибка. Однако я не понимаю, почему схема или имя могут вызвать проблему, поскольку все имена столбцов явно являются строками. Любая помощь приветствуется.


person Sean Payne    schedule 21.02.2021    source источник
comment
schema — это аргумент 3-й позиции, который по умолчанию равен None, но вы его предоставляете: 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') — это может помочь   -  person Jon Clements♦    schedule 21.02.2021
comment
@JonClements, ты потрясающий. Спасибо, дело именно в этом.   -  person Sean Payne    schedule 21.02.2021


Ответы (1)


Функция подпись:

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')

Вы думаете, что размер фрагмента интерпретируется как аргумент schema, поэтому измените размер фрагмента, чтобы он был явно назван, например:

df.to_sql(self.staging_table, db.engine, chunksize=self.chunksize, method='multi')
person Jon Clements♦    schedule 21.02.2021
comment
Еще раз спасибо, Джон. - person Sean Payne; 21.02.2021