[英]Unable to copy data from CSV to MySQLdb using Python
我是MySQL和Python的新手,我正嘗試使用python從簡單的csv文件中將單個數據列讀取到本地MySQL表中,但它反復拋出一些錯誤。 在鍵盤上敲了幾個小時之后,我糾正了一些語法錯誤,現在我被困在這里。 任何幫助將不勝感激。 也請原諒我在這里格式化問題,因為這是我第一次。
import csv
import MySQLdb
mydb = MySQLdb.connect(host='localhost',
user='root',
passwd='',
db='test1')
cursor = mydb.cursor()
csv_data = csv.reader(file('csv1.csv'))
for row in csv_data:
cursor.execute("INSERT INTO log1(speed) values( %s )" %row)
#close the connection to the database.
mydb.commit()
cursor.close()
print "Done"
這是顯示的錯誤:
Traceback (most recent call last):
File "test2.py", line 13, in <module>
cursor.execute("INSERT INTO log1(speed) values( %s )" %row)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 226, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorvalue
_mysql_exceptions.ProgrammingError: (1064, "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 '['85.26'] )' at line 1")
csv文件包含某些測試數據,如下所示:
85.26
72.67
80.12
99.86
65.64
而且我的數據庫似乎具有以下結構:
+-------+---------+
| speed | test_id |
+-------+---------+
| 98.86 | 1 |
| 88.86 | 2 |
| 78.86 | 3 |
+-------+---------+
其中speed是需要從csv文件讀取的字段,而test_id是自動遞增的主鍵
編輯
根據Visweswaran的建議,我將代碼更改如下:
import csv
import MySQLdb
mydb = MySQLdb.connect(host='localhost',
user='root',
passwd='',
db='test1')
cursor = mydb.cursor()
csv_data = csv.reader(file('csv1.csv'))
for row in csv_data:
cursor.execute("INSERT INTO log1(speed) values( %s )" %row[0])
#close the connection to the database.
mydb.commit()
cursor.close()
print "Done"
現在,這似乎已經修復了Type:List錯誤,但是現在出現以下錯誤:
File "test2.py", line 12, in <module>
cursor.execute("INSERT INTO log1(speed) values( %s )" %row[0])
IndexError: list index out of range
我敢肯定,我缺少一些基本知識並且做的事情很愚蠢,但是先生,您的支持將非常有幫助。
形成您的問題,我轉載了這樣的表格,
如果不存在則創建表log1(速度浮動不為null,test_id int(2)無符號主鍵auto_increment);
但是該行是一個列表,而不是列表中的字符串,因此我對此進行了一些修改,
>>> if len(row) > 0:
cursor.execute("INSERT INTO log1(speed) values( %s )" %row[0])
csv將元組(在數據庫中-也稱為行)作為python列表提供。 因為您只有一列,所以我添加了row [0],它給出了第一行中每一行的值。
最后,插入值
+-------+---------+
| speed | test_id |
+-------+---------+
| 85.26 | 1 |
| 72.67 | 2 |
| 80.12 | 3 |
Parfait在說什么:為什么不應該使用字符串格式來構造查詢
他說,該代碼容易受到關系數據庫管理系統指紋的影響。
考慮表中的以下代碼:
value = input("Enter the value: ")
cursor.execute("select * from log1 where test_id = "+value)
data = cursor.fetchall()
for i in data:
print(i['speed'])
print(i['test_id'])
用戶應該在其中輸入test_id的值,並顯示速度和test_id。
考慮,我是一個遠程用戶(攻擊者)現在輸入1,您的程序將輸出
Enter the value: 1
1.0
1
Done
好的,這可以給我速度和test_id,並且程序運行正常。
好的,現在我將其作為經過精心設計的查詢作為輸入,
Enter the value: 1 order by 1--
1.0
1
Done
看到相同的輸出顯示,但是現在當我將此查詢作為輸入時輸入值:1乘3的順序-顯示一條錯誤消息,因此我住在偏遠地區,我知道您的數據庫中有一個表,其中有兩個表列。
現在,請看此輸入
Enter the value: -1 union select 1,unhex(hex(version()))--
1.0
b'5.X.X-X'
Done
我可以得到您的數據庫版本為5.XX(實際輸出將顯示確切的版本。我有點偏執)。
這種攻擊稱為基於聯合的SQL注入攻擊。 還有其他各種類別,例如盲人等等,在這里我不願意介紹太多東西。
因此,正如他建議的那樣,我將編寫一個查詢以傳遞這樣的參數,
cursor.execute("select * from log1 where test_id = ",value)
現在我們將嘗試獲取版本
Enter the value: 1 union select 1,unhex(hex(verison()))--
結果:TypeError ....
即使這也不是一個完整的解決方案。 您必須集中處理很多漏洞。
請不要擔心(如您所說的noobie),沒有機構是該安全領域的專家。 這需要經驗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.