2015-07-23 3 views
1

У меня есть база данных, которая содержит 7 полей, поле 1 уникально, а остальные нет. Однако поля 2 и 3 могут быть нулевыми. Я пытаюсь обновить базу данных информацией из файла csv, чтобы заполнить нули, но я не могу заставить его работать. Поле может быть нулевым или поле может уже содержать информацию.MySQL, строка обновления python, если null

db=mdb.connect('localhost','username','password','db') 
cur=db.cursor() 
inputinfo=csv.reader(open('Insert.csv','r'),delimiter=',') 
for row in inputinfo: 
    inserthostNames=("""update fileSort set hostNames=values(hostNames) where hostNames is not null""") 
    cur.execute(inserthostNames,row[1]) 
    insertIPAddress=("""update fileSort set IPAddress=values(IPAddress) where IPAddress is not null""") 

Он не работает и дает мне ошибку

Traceback (most recent call last): 
    File "test.py", line 57, in <module> 
    insertTADDM() 
    File "test.py", line 47, in insertTADDM 
    cur.execute(inserthostNames,row[1]) 
    File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 159, in execute 
    query = query % db.literal(args) 
TypeError: not all arguments converted during string formatting 

Edit1:

for row in inputinfo: 
    inserthostNames=("""update fileSort set hostNames=hostNames where hostNames is null""",row) 
    cur.execute(inserthostNames,row[1]) 
    insertIPAddress=("""update fileSort set IPAddress=IPAddress where IPAddress is null""",row) 
    cur.execute(insertIPAddress,row[2]) 

это дает ошибку:

TypeError: unsupported operand type(s) for %: 'tuple' and 'str' 

Edit 2:

for row in inputinfo: 
    inserthostNames=("""update fileSort set hostNames='%s' where hostNames is null""") 
    cur.execute(inserthostNames,(db.escape_string(row[1]))) 
    #insertIPAddress=("""update fileSort set IPAddress='%s' where IPAddress is null""") 
    #cur.execute(insertIPAddress,row[2]) 
db.commit() 

дает мне:

_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 'SERVER2'' where hostNames is null' at line 1") 

апостроф ВЕРНУЛСЯ

+0

Так в чем же проблема? – Mureinik

+0

Поскольку вы не предоставляете ошибку, которую получаете, я буду держать пари, что она связана с неправильным синтаксисом SQL в ваших операциях 'update'. Первым, например, должно быть «update fileSort set hostNames = hostNames, где hostNames не null». Также обратите внимание, что вы не выполняете второй оператор. – DeepSpace

+0

он выполнит, но ничего не сделает, но я могу увидеть нулевые поля, и я могу найти значение в файле csv –

ответ

1

Вашей execute функции содержит параметр, row[1] но нет места для подстановки в строке запроса. Кроме того, параметры должны передаваться как последовательность. Кроме того, если вы хотите заполнить нули, то условие where должно быть where hostNames is null.

Более того, поскольку hostNames может содержать специальные символы, вы можете захотеть, чтобы избежать его с помощью conn.escape_string

Вы можете изменить свой запрос:

inserthostNames=("""update fileSort set hostNames='%s' where hostNames is null""") 
cur.execute(inserthostNames,(db.escape_string(row[1]))) 
+0

, это выплевывает ошибку _mysql_exceptions.ProgrammingError: (1064, «У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с« SERVER2 », где hostNames имеет значение« null »в строке 1»). –

+0

Что значение вашей 'row [1]'?Вы должны удалить ненужный '' ' –

+0

, если я посмотрю в gedit, это значение SERVER2, но я вижу, что вы подразумеваете под ненужным« больным », чтобы посмотреть, как избавиться от этого –

0

Я не уверен, если это именно то, о чем вы говорите, но у меня были некоторые проблемы с интерпретацией нулей в mysql и исправлено путем изменения исходного файла. Я изменил исходный файл, чтобы заменить пустые ячейки строкой «Null». Программа записывает новый файл, поэтому ваш исходный файл должен быть немодифицирован. Файл, который написан, не идеален, но может быть легко изменен в Excel, чтобы иметь соответствующий формат. Затем я использовал локальную информацию, чтобы перезагрузить ее в базу данных. Надеюсь, это поможет и сообщит мне, есть ли у вас проблема с кодом.

import csv 

output= open("practice_output.csv","w") #Replace practice_output.csv with desired output name. 


with open('practice.csv',"rU") as csvfile: #replace practice.csv with input file name. 
    ACS = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    count= [] # A rough way to track how fast the program reads through lines. 
    for row in ACS: 
     row=','.join(row) 
     row=row.split(",") 
     list = [] 
     for item in row: 
      print item 
      item=str(item) 
      if item != "": 
       #output.write(item + ",") 
       list.append(item) 
      else: 
       item= item.replace("","NULL") 
       #output.write(item+",") 
       list.append(item) 
     list=','.join(list) 
     count.append("1") 
     print len(count) ### Allows to show when each line is completed when running very large files. 
     output.write(list+"\r\n,") 

output.close()