Mysql
csv 導入失敗且未引發錯誤
我正在嘗試將 csv 文件導入現有
mysql 5.7
表。這是命令(數據庫在 docker 中,帶有綁定掛載以實現持久性)
mysql -h 127.0.0.1 -uroot -prootpass --local_infile=1 jira_statistics -e "LOAD DATA LOCAL INFILE '/home/centos/bugs.csv' INTO TABLE bugs FIELDS TERMINATED BY ','"
然而:
mysql> select * from bugs; Empty set (0.05 sec)
由於存在外鍵約束,無法載入該文件。我需要能夠擷取這樣的錯誤(以及可能發生的任何其他錯誤)作為退出程式碼,因為我將編寫大量這樣的導入腳本。
命令行沒有返回錯誤,
docker
MySQL 容器的日誌顯示沒有錯誤。更重要的是,該
mysql
命令的退出程式碼是0
!有任何想法嗎?
封裝
LOAD
在一個儲存過程中。在那裡,擷取錯誤並將其公開給您的腳本。但是,如果
LOAD DATA
不允許在儲存過程中使用,那麼您確實需要編寫應用程式碼,而不是依賴於線上 shell 腳本。
我無法得到mysql 返回的值,但是當由於某種原因無法將值插入列時,您可以通過將選項添加到命令行來
%ERRORLEVEL%
列印到控制台的警告。LOAD DATA LOCAL INFILE``--batch
我正在使用帶有 MySQL 8.0.22 的 Windows;這是我在 .cmd 文件中使用的測試命令:
@"C:\Program Files\MySQL\MySQL Workbench 8.0 CE\mysql.exe" --show-warnings --batch -h 127.0.0.1 -uxxx -pxxx --local_infile=1 test -e "LOAD DATA LOCAL INFILE '/temp/test.csv' INTO TABLE bugs FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';" @ECHO %ERRORLEVEL%
/temp/test.csv
我正在使用的包含:1 二、測試 3 4
表
bugs
:CREATE TABLE `bugs` ( `i` int NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
執行批處理文件的輸出:
mysql: [Warning] Using a password on the command line interface can be insecure. Warning (Code 1366): Incorrect integer value: 'two' for column 'i' at row 2 Warning (Code 1262): Row 2 was truncated; it contained more data than there were input columns 0
如您所見,出現了一條警告,告訴我們
'two'
無法將i
. 該行也被截斷,因為沒有值“test”的列。最後
0
一行是%errorlevel%
值。我嘗試將
LOAD DATA
命令添加到儲存過程中,以便為 SQL 異常創建退出句柄,但是 MySQL 阻止了LOAD DATA
在儲存過程中的使用。這是錯誤:錯誤程式碼:1314。儲存過程中不允許載入數據