簡體   English   中英

將 CSV 數據插入 AWS RDS MySQL DB 時出現錯誤消息 1054“'字段列表'中的未知列。請告訴我如何解決此錯誤

[英]When inserting CSV data into AWS RDS MySQL DB getting errorMessage 1054 "Unknown column in 'field list'. Please let me know how to fix this error

This is the AWS Lambda function lambda_function.py code in which I am working on to read the CSV data from AWS S3 bucket and to insert it into AWS RDS MySQL database.

import json
import boto3
import sys
import logging
import rds_config
import pymysql
import csv

s3_client = boto3.client("s3")

#rds settings
rds_host  = "myrdsdatabase-xxxxx-amazonaws.com"
name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name

logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
except pymysql.MySQLError as e:
    logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.")
    logger.error(e)
    sys.exit()

logger.info("SUCCESS: Connection to RDS MySQL instance succeeded")

def lambda_handler(event, context):
    
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    s3_file_name = event['Records'][0]['s3']['object']['key']
    csv_file = s3_client.get_object(Bucket=bucket_name,Key=s3_file_name)
    record_list = csv_file['Body'].read().decode("utf-8").split('\n')
    print('RAW CSV Data:')
    print(record_list)
    csv_reader = csv.reader(record_list, delimiter=',', quotechar='"')
    colheader, *rows = csv_reader
    print('Data to be inserted into RDS MySQL:')
    for r in rows:
        empID = r[0]
        empName = r[1]
        print(empID+' '+empName)    
    
    """
    This function fetches content from MySQL RDS instance
    """
    result = []
    
    with conn.cursor() as cur:
        #cur.execute("create table Employee ( EmpID int NOT NULL, EmpName varchar(255) NOT NULL, PRIMARY KEY (EmpID))")
        #cur.execute("Drop table Employee")
        #cur.execute("Delete from Employee")
        #cur.execute('insert into Employee (EmpID, EmpName) values(0,"Test")')
        #cur.execute("select * from Employee")
        #conn.commit()
        #cur.close()
        
        for r in rows:
            empID = r[0]
            empName = r[1]
            cur.execute('insert into Employee (EmpID, EmpName) values('+empID+','+empName+')')
            cur.execute("select * from Employee")
            conn.commit()
            cur.close()
            
        for row in cur:
            result.append(list(row))
        print ("Data from AWS RDS MySQL...")
        print (result)

Output:-

Response:
{
  "errorMessage": "(1054, \"Unknown column 'Tom' in 'field list'\")",
  "errorType": "InternalError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 62, in lambda_handler\n    cur.execute('insert into Employee (EmpID, EmpName) values('+empID+','+empName+')')\n",
    "  File \"/var/task/pymysql/cursors.py\", line 165, in execute\n    result = self._query(query)\n",
    "  File \"/var/task/pymysql/cursors.py\", line 321, in _query\n    conn.query(q)\n",
    "  File \"/var/task/pymysql/connections.py\", line 860, in query\n    self._affected_rows = self._read_query_result(unbuffered=unbuffered)\n",
    "  File \"/var/task/pymysql/connections.py\", line 1061, in _read_query_result\n    result.read()\n",
    "  File \"/var/task/pymysql/connections.py\", line 1349, in read\n    first_packet = self.connection._read_packet()\n",
    "  File \"/var/task/pymysql/connections.py\", line 1018, in _read_packet\n    packet.check_error()\n",
    "  File \"/var/task/pymysql/connections.py\", line 384, in check_error\n    err.raise_mysql_exception(self._data)\n",
    "  File \"/var/task/pymysql/err.py\", line 107, in raise_mysql_exception\n    raise errorclass(errno, errval)\n"
  ]
}

Request ID:
"6b8f70cd-dc9a-458c-9024-c4ecdb9a913e"

Function logs:
START RequestId: 6b8f70cd-dc9a-458c-9024-c4ecdb9a913e Version: $LATEST
RAW CSV Data:
['EmpID,EmpName\r', '1,Tom\r', '2,Jack\r', '3,Ross\r', '4,William']
Data to be inserted into RDS MySQL:
1 Tom
2 Jack
3 Ross
4 William
[ERROR] InternalError: (1054, "Unknown column 'Tom' in 'field list'")
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 62, in lambda_handler
    cur.execute('insert into Employee (EmpID, EmpName) values('+empID+','+empName+')')
  File "/var/task/pymysql/cursors.py", line 165, in execute
    result = self._query(query)
  File "/var/task/pymysql/cursors.py", line 321, in _query
    conn.query(q)
  File "/var/task/pymysql/connections.py", line 860, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "/var/task/pymysql/connections.py", line 1061, in _read_query_result
    result.read()
  File "/var/task/pymysql/connections.py", line 1349, in read
    first_packet = self.connection._read_packet()
  File "/var/task/pymysql/connections.py", line 1018, in _read_packet
    packet.check_error()
  File "/var/task/pymysql/connections.py", line 384, in check_error
    err.raise_mysql_exception(self._data)
  File "/var/task/pymysql/err.py", line 107, in raise_mysql_exception
    raise errorclass(errno, errval)
END RequestId: 6b8f70cd-dc9a-458c-9024-c4ecdb9a913e
REPORT RequestId: 6b8f70cd-dc9a-458c-9024-c4ecdb9a913e  Duration: 223.12 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 80 MB  Init Duration: 488.20 ms    

注意:- 我可以將硬代碼值插入 RDS MySQL 數據庫,但是當嘗試插入 CSV 文件值時,只會收到此錯誤。

如果需要任何有助於調試此錯誤並找到根本原因的進一步信息,請告訴我。

提前致謝!!!

cur.execute 調用中存在語法問題。 現在更改語法后,我可以成功地將 CSV 數據插入 RDS MySQL 數據庫。

更正:

cur.execute("insert into Employee (EmpID, EmpName) values(%s,%s)", (empID,empName))

我相信這個問題源於這一行:

cur.execute('insert into Employee (EmpID, EmpName) values('+empID+','+empName+')')

員工姓名是一個字符串,但在生成的 SQL 語句中沒有被引用。 目前的方式將導致 SQL 語句,如:

INSERT INTO Employee (EmpID, EmpName) VALUES (1, Tom);

你想要的是:

INSERT INTO Employee (EmpID, EmpName) VALUES (1, 'Tom'); (注意湯姆周圍的引號)

您可以將這些引號添加到 cur.execute 調用中:

cur.execute('insert into Employee (EmpID, EmpName) values (' + empID + ', "' + empName + '")')

或者使用這里描述的語法: How to use variables in SQL statement in Python?

暫無
暫無

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

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