我正在嘗試在 mysql 表中插入資料框行,但我在字符和數字列中有 NA 值。我收到此錯誤:.local(conn, statement, ...) 中的錯誤:無法運行陳述句:“欄位串列”中的未知列“NA”
這是我的查詢:
sql <- sprintf("insert into payment (amount,payment_type,date,customer_total,base_price, p2c_total, partner_total, pay_online, pay_at_lot,tax,first_name_on_card,last_name_on_card,address)
values (%f, %d, '%s',%f,%f,%f,%f,%f,%f,%f,'%s','%s','%s');",
payments[i,]$amount,payments[i,]$payment_type,payments[i,]$date, payments[i,]$customer_total,
payments[i,]$base_price, payments[i,]$p2c_total, payments[i,]$partner_total,
payments[i,]$pay_online,payments[i,]$pay_at_lot,payments[i,]$tax,
payments[i,]$first_name_on_card, payments[i,]$last_name_on_card, payments[i,]$address)
rs <- dbSendQuery(db, sql[i])
dbClearResult(rs)
這是sql代碼:
insert into reservation (reservation_number, driver_name, number_passengers, checkin_datetime, checkout_datetime, days, reservation_date, reservation_email,id_reservation_status, id_payment, id_ship, id_facility, id_user) values ('j990j','CB', 4, '2020-01-12 10:00:00', '2020-01-19 10:30:00', 8, 'NA', '[email protected]',NA, 1, 2, 547, 6);
這是 mysql 錯誤:#1054 - La columna 'NA' en field list es desconocida
MySQL 版本:8.0.27
R版本:4.03
RMySQL 包:0.10.22
uj5u.com熱心網友回復:
三種方式來看待這個問題:
不要
sprintf/pastedata變成查詢字串。除了關于惡意 SQL 注入的安全問題(例如,XKCD 的Exploits of a Mom又名“Little Bobby Tables”),它也是對格式錯誤的字串或 Unicode-vs-ANSI 錯誤的問題,即使它是一個運行查詢的資料分析師.方便的是,有一個函式可以以
data.frame更安全的方式將資料從 a 插入到表中:dbAppendTable. 你也許可以做dbAppendTable(db, "payment", payments[i,])如果需要插入所有列,否則需要更詳細的內容:
dbAppendTable(db, "payment", payments[i,c("amount", "payment_type", "date", "customer_total", "base_price", "p2c_total", "partner_total", "pay_online", "pay_at_lot", "tax", "first_name_on_card", "last_name_on_card", "address")])如果您打算對超過 1 行執行此操作,則
dbAppendTable可以毫無問題地采用多行。如果你真的想用你自己的陳述句一次做一行
insert,那么我強烈建議你使用引數化查詢,也許是這樣的:qry <- "insert into payment (amount,payment_type,date,customer_total,base_price, p2c_total, partner_total, pay_online, pay_at_lot,tax,first_name_on_card,last_name_on_card,address) values (?, ?, ?,?,?,?,?,?,?,?,?,?,?);" dbExecute(db, qry, params = payments[i, c("amount", "payment_type", ...)])(這提醒我......
dbExecute是一個很好的包裝器,它dbSendStatement總是跟著dbClearResult。還有dbGetQuery一個dbSendQuery總是跟著dbClearResult,回傳資料。你沒有從表中回傳行,所以第一個是首選。)注意:此功能需要最新的驅動程式才能訪問資料庫。如果您正在使用,
RMySQL那么存在一個問題:該軟體包多年來(截至目前)沒有看到實質性更新,并且不支持引數化查詢。我相信這個RMariaDB包既與 MySQL 完全兼容,又支持引數化查詢。如果您真的必須手動執行此操作(實際上,我強烈反對這樣做,很多次我認為我可以規避風險,但每次都會被咬),那么 R's 會
NA轉換為null(沒有引號!)。為此,您需要有條件地添加引號。就像是:ifelse(is.na(payments[i,]$date), "null", sQuote(payments[i,]$date))對于查詢中的每個類似字串的欄位,并確保更改
'%s'為%s您的格式。幾乎可以肯定有更好的方法可以自動執行此操作,這樣您就不會輸入一打或更多ifelse的 s,但在我看來,這樣做真的不值得這樣做。(如果你依賴于不同的語意
sprintf("%s", ..)與隱式字串化 withsQuote,那么你可能需要更多的肘部潤滑脂。)
uj5u.com熱心網友回復:
把你包NA起來'NA'
insert into reservation (reservation_number, driver_name, number_passengers, checkin_datetime, checkout_datetime, days, reservation_date, reservation_email,id_reservation_status, id_payment, id_ship, id_facility, id_user) values ('j990j','CB', 4, '2020-01-12 10:00:00', '2020-01-19 10:30:00', 8, 'NA', '[email protected]','NA', 1, 2, 547, 6);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/475227.html
