簡體   English   中英

嘗試使用 Python 將數據插入 MySQL 表時出現編程錯誤

[英]ProgrammingError while trying to insert data into a MySQL table using Python

雖然我對 SQL 很陌生,但我已經使用 python 來構建數據庫,但現在我被卡住了。

簡單來說,我有一個包含三個表的模式,它們通過外鍵相互關聯。 它們是使用 python 創建的,如下所述(未顯示cconn的定義,因為我很確定錯誤不存在):

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

samplesMasterrunsMaster表都工作正常。 它們是從其他迭代中自動填充的,這些迭代對於理解這個問題並不那么重要。

經過幾次操作,我想從 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. 表創建。 我一直在使用runsMastersamplesMaster的方式
  2. 我試圖插入到XYStats表中的數據類型> XY_df是 pandas 數據幀,我試圖插入的數據類型(例如XY_df.iloc[0,3] )是numpy.float64type(XY_df.iloc[0,1]) )

但除此之外,我對正在發生的事情一無所知,因為我收到的錯誤消息非常模糊。

該錯誤是您在 SQL 上執行的查詢中的語法錯誤。 在 VALUES 之后有一個未閉合的括號。 您需要做的就是在查詢字符串的末尾添加一個右括號,然后您就可以使用 go:

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]}')
""")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM