INSERT SELECT * FROM ON DUPLICATE 结果错误 1136

INSERT SELECT * FROM ON DUPLICATE Results in Error 1136

我正在尝试 insert/update 将 df 转换为 mysql table。我收到这个错误

"_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()

这是我正在尝试 insert/update 数据的 table 的架构。

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    |       |
+----------------------------+-------------+------+-----+---------+-------+

table db.filmsdb.t 的架构不匹配。因此,您需要定义 table db.films 的哪些列将设置为 table ``.

中的哪个值

试试这个查询:

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