簡體   English   中英

無法使用Python將數據從CSV復制到MySQLdb

[英]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.

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