2015-12-26 2 views
-1

Я пытаюсь вставить/обновить df в таблицу mysql. Я получаю эту ошибкуINSERT SELECT * FROM ON DUPLICATE Результаты с ошибкой 1136

"_mysql_exceptions.OperationalError: (1136, "Column count doesn't match value count at row 1")"

на строке выполнения в приведенном ниже коде. Любые предложения по обходному пути или более эффективному пути?

db = MySQLdb.connect(
    host = "myhost", 
    user = "username", 
    passwd = "password", 
    db = "mydb", 
    charset='utf8' 
) 

df.to_sql(con=db, name='t', if_exists='replace', flavor='mysql') 

sqlStatement = """INSERT INTO db.films SELECT t.* FROM db.t 
      ON DUPLICATE KEY UPDATE 
      films.releasedP=t.releasedP, 
      films.runtimeP=t.runtimeP, 
      films.imdbRatingP=t.imdbRatingP, 
      films.votesYearP=t.votesYearP, 
      films.years=t.years, 
      films.votesYear=t.votesYear 
      ;""" 

cursor = db.cursor() 
cursor.execute(sqlStatement) 
db.commit() 

Это схема таблиц, в которые я пытаюсь вставить/обновить данные.

DESCRIBE db.t; 

+----------------------------+-------------+------+-----+---------+-------+ 
| Field      | Type  | Null | Key | Default | Extra | 
+----------------------------+-------------+------+-----+---------+-------+ 
| Title      | varchar(63) | YES |  | NULL |  | 
| imdbID      | varchar(63) | YES |  | NULL |  | 
| Released     | varchar(63) | YES |  | NULL |  | 
| Runtime     | varchar(63) | YES |  | NULL |  | 
| imdbRating     | varchar(63) | YES |  | NULL |  | 
| imdbVotes     | varchar(63) | YES |  | NULL |  | 
| releasedDateTime   | datetime | YES |  | NULL |  | 
| maxDateTime    | datetime | YES |  | NULL |  | 
| years      | float  | YES |  | NULL |  | 
| votesYear     | float  | YES |  | NULL |  | 
| rating      | float  | YES |  | NULL |  | 
| runtimeF     | float  | YES |  | NULL |  | 
| releasedP     | float  | YES |  | NULL |  | 
| runtimeP     | float  | YES |  | NULL |  | 
| imdbRatingP    | float  | YES |  | NULL |  | 
| votesYearP     | float  | YES |  | NULL |  | 
+----------------------------+-------------+------+-----+---------+-------+ 

DESCRIBE db.films; 

+----------------------------+-------------+------+-----+---------+-------+ 
| Field      | Type  | Null | Key | Default | Extra | 
+----------------------------+-------------+------+-----+---------+-------+ 
| Actors      | varchar(63) | YES |  | NULL |  | 
| Awards      | varchar(63) | YES |  | NULL |  | 
| Country     | varchar(63) | YES |  | NULL |  | 
| Director     | varchar(63) | YES |  | NULL |  | 
| Genre      | varchar(63) | YES |  | NULL |  | 
| Language     | varchar(63) | YES |  | NULL |  | 
| Metascore     | varchar(63) | YES |  | NULL |  | 
| Plot      | varchar(63) | YES |  | NULL |  | 
| Poster      | varchar(63) | YES |  | NULL |  | 
| Rated      | varchar(63) | YES |  | NULL |  | 
| Released     | varchar(63) | YES |  | NULL |  | 
| Response     | varchar(63) | YES |  | NULL |  | 
| Runtime     | varchar(63) | YES |  | NULL |  | 
| Title      | varchar(63) | YES |  | NULL |  | 
| Type      | varchar(63) | YES |  | NULL |  | 
| Writer      | varchar(63) | YES |  | NULL |  | 
| Year      | varchar(63) | YES |  | NULL |  | 
| imdbID      | varchar(63) | YES | UNI | NULL |  | 
| imdbRating     | varchar(63) | YES |  | NULL |  | 
| imdbVotes     | varchar(63) | YES |  | NULL |  | 
| years      | float  | YES |  | NULL |  | 
| votesYear     | float  | YES |  | NULL |  | 
| rating      | float  | YES |  | NULL |  | 
| runtimeF     | float  | YES |  | NULL |  | 
| releasedP     | float  | YES |  | NULL |  | 
| runtimeP     | float  | YES |  | NULL |  | 
| imdbRatingP    | float  | YES |  | NULL |  | 
| votesYearP     | float  | YES |  | NULL |  | 
| releasedDateTime   | datetime | YES |  | NULL |  | 
| maxDateTime    | datetime | YES |  | NULL |  | 
+----------------------------+-------------+------+-----+---------+-------+ 
+3

Что такое схема для таблицы 'db.t'? Является ли швы, что две схемы таблицы не совпадают. –

ответ

2

Схемы таблиц db.films и db.t не совпадают. Поэтому вам нужно определить, какие столбцы таблицы db.films будут установлены в значение, указанное в таблице ``.

Попробуйте этот запрос:

INSERT INTO db.films (
    Title, 
    imdbID, 
    Released, 
    Runtime, 
    imdbRating, 
    imdbVotes, 
    releasedDateTime, 
    maxDateTime, 
    years, 
    votesYear, 
    rating, 
    runtimeF, 
    releasedP, 
    runtimeP, 
    imdbRatingP, 
    votesYearP 
) 
SELECT 
    Title, 
    imdbID, 
    Released, 
    Runtime, 
    imdbRating, 
    imdbVotes, 
    releasedDateTime, 
    maxDateTime, 
    years, 
    votesYear, 
    rating, 
    runtimeF, 
    releasedP, 
    runtimeP, 
    imdbRatingP, 
    votesYearP 
FROM db.t 
ON DUPLICATE KEY UPDATE 
    films.releasedP=t.releasedP, 
    films.runtimeP=t.runtimeP, 
    films.imdbRatingP=t.imdbRatingP, 
    films.votesYearP=t.votesYearP, 
    films.years=t.years, 
    films.votesYear=t.votesYear 
+0

Мне жаль, Пол, но это была опечатка от моего имени, которую я обновил. Поля соответствуют. –

+1

Вы обновили вопрос, пока я писал ответ. Я также обновил ответ. –

+0

Спасибо, FYI: Мне просто нужно указать поля INSERT INTO, поскольку они все еще работают со звездочкой в ​​части SELECT инструкции. –

Смежные вопросы