ProgrammingError при попытке вставить данные в таблицу MySQL с помощью Python - PullRequest
0 голосов
/ 27 сентября 2019

Хотя я довольно новичок в SQL, я уже использовал python для создания БД, но теперь я застрял.

Проще говоря, у меня есть схема с тремя таблицами, которые связаны друг с другомчерез внешние ключи.Они были созданы с использованием Python, как описано ниже (без показа определений c и conn, так как я почти уверен, что ошибка не лежит там):

import sqlalchemy
import pandas as pd

# create the runsMaster table
c.execute("""CREATE TABLE IF NOT EXISTS `ngsRunStats_FK`.`runsMaster` (
    `run_ID` INT NOT NULL AUTO_INCREMENT,
    `run_name` VARCHAR(50) NULL,
    PRIMARY KEY (`run_ID`))
ENGINE = InnoDB""")

# Create the samplesMaster table
c.execute("""CREATE TABLE IF NOT EXISTS `ngsRunStats_FK`.`samplesMaster` (
  `sample_ID` INT NOT NULL AUTO_INCREMENT,
  `run_ID` INT NULL,
  `sample_name` VARCHAR(50) NULL,
  PRIMARY KEY (`sample_ID`),
  INDEX `fk_table1_runsMaster1_idx` (`run_ID` ASC),
  CONSTRAINT `fk_table1_runsMaster1`
    FOREIGN KEY (`run_ID`)
    REFERENCES `ngsRunStats_FK`.`runsMaster` (`run_ID`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB""")

# Create the XYStats table
c.execute("""CREATE TABLE IF NOT EXISTS `ngsRunStats_FK`.`XYstats` (
  `XYstats_ID` INT NOT NULL AUTO_INCREMENT,
  `run_ID` INT NULL,
  `sample_ID` INT NULL,
  `X_TOTAL_COVERAGE` FLOAT NULL,
  `X_TARGET_COUNT` FLOAT NULL,
  `X_MEAN_TARGET_COVERAGE` FLOAT NULL,
  `Y_TOTAL_COVERAGE` FLOAT NULL,
  `Y_TARGET_COUNT` FLOAT NULL,
  `Y_MEAN_TARGET_COVERAGE` FLOAT NULL,
  `Ymeancov_Xmeancov` FLOAT NULL,
  PRIMARY KEY (`XYstats_ID`),
  INDEX `fk_XYstats_runsMaster_idx` (`run_ID` ASC),
  INDEX `fk_XYstats_samplesMaster1_idx` (`sample_ID` ASC),
  CONSTRAINT `fk_XYstats_runsMaster`
    FOREIGN KEY (`run_ID`)
    REFERENCES `ngsRunStats_FK`.`runsMaster` (`run_ID`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_XYstats_samplesMaster1`
    FOREIGN KEY (`sample_ID`)
    REFERENCES `ngsRunStats_FK`.`samplesMaster` (`sample_ID`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB""")

Оба samplesMaster и таблица runsMaster работают нормально.Они автоматически заполняются из других итераций, которые не так важны для понимания этой проблемы.

После нескольких операций я хочу извлечь некоторые значения из pandas df (XY_df) и вставить вXYStats таблица.Мой pandas df выглядит следующим образом

                   0              1     2           3
0                  X  121424.000000  64.0  1897.26000
1                  Y      14.019900   4.0     3.50497
2  Ymeancov/Xmeancov       0.001847   NaN         NaN

Ниже приведен словарь, который можно получить из таблицы с XY_df.to_dict()

{0: {0: 'X', 1: 'Y', 2: 'Ymeancov/Xmeancov'},
 1: {0: 121424.0, 1: 14.0199, 2: 0.00184739},
 2: {0: 64.0, 1: 4.0, 2: nan},
 3: {0: 1897.26, 1: 3.5049699999999997, 2: nan}}

Кодом, который я использую для заполнения XYStats таблица показана ниже:

c.execute(f"""INSERT INTO XYstats (run_ID, sample_ID, X_TOTAL_COVERAGE, X_TARGET_COUNT, X_MEAN_TARGET_COVERAGE, Y_TOTAL_COVERAGE, Y_TARGET_COUNT, Y_MEAN_TARGET_COVERAGE, Ymeancov_Xmeancov)
VALUES
('{runID}', 
'{sampleID}',
'{XY_df.iloc[0,1]}',
'{XY_df.iloc[0,2]}',
'{XY_df.iloc[0,3]}',
'{XY_df.iloc[1,1]}',
'{XY_df.iloc[1,2]}',
'{XY_df.iloc[1,3]}',
'{XY_df.iloc[2,1]}'
""")
conn.commit()

Но тогда я получаю

ProgrammingError: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 11

Что вообще не информативно Я считаю

Я совершенно уверен, что моя ошибка не лежит в

  1. Создание таблиц.Я использовал runsMaster, а также samplesMaster такими, какими они являются
  2. Тип данных, который я пытаюсь вставить в таблицу XYStats> XY_df, представляет собой фрейм данных pandas ия пытаюсь вставить (например, XY_df.iloc[0,3]) numpy.float64 (type(XY_df.iloc[0,1]))

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

1 Ответ

0 голосов
/ 27 сентября 2019

Ошибка является синтаксической ошибкой в ​​запросе, который вы выполняете на SQL.У вас есть незакрытая скобка после ЗНАЧЕНИЙ.Все, что вам нужно сделать, это добавить закрывающую скобку в конце строки запроса, и все готово:

c.execute(f"""INSERT INTO XYstats (run_ID, sample_ID, X_TOTAL_COVERAGE, X_TARGET_COUNT, X_MEAN_TARGET_COVERAGE, Y_TOTAL_COVERAGE, Y_TARGET_COUNT, Y_MEAN_TARGET_COVERAGE, Ymeancov_Xmeancov)
VALUES
('{runID}', 
'{sampleID}',
'{XY_df.iloc[0,1]}',
'{XY_df.iloc[0,2]}',
'{XY_df.iloc[0,3]}',
'{XY_df.iloc[1,1]}',
'{XY_df.iloc[1,2]}',
'{XY_df.iloc[1,3]}',
'{XY_df.iloc[2,1]}')
""")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...