首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL,python更新行如果为null

MySQL,python更新行如果为null
EN

Stack Overflow用户
提问于 2015-07-23 16:02:19
回答 2查看 2.1K关注 0票数 1

我有一个包含7个字段的数据库,字段1是唯一的,其余的则不是。但是,字段2和3可能为空。我试图用csv文件中的信息更新数据库,以填充空值,但我无法让它工作。该字段可能为null,或者该字段可能已经包含该信息。

代码语言:javascript
复制
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""")

它不起作用,给了我错误

代码语言:javascript
复制
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:

代码语言:javascript
复制
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])

这就产生了错误:

代码语言:javascript
复制
TypeError: unsupported operand type(s) for %: 'tuple' and 'str'

编辑2:

代码语言:javascript
复制
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()

给我:

代码语言:javascript
复制
_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")

撇号又回来了

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-23 16:21:15

execute函数包含一个参数row[1],但查询字符串中没有替换位置。此外,参数必须作为序列传递。此外,如果您想要填充空,那么where条件应该是where hostNames is null

此外,由于hostNames可能包含特殊字符,因此您可能希望使用conn.escape_string转义它。

您可能希望将查询更改为:

代码语言:javascript
复制
inserthostNames=("""update fileSort set hostNames='%s' where hostNames is null""")
cur.execute(inserthostNames,(db.escape_string(row[1])))
票数 1
EN

Stack Overflow用户

发布于 2015-07-23 16:37:49

我不确定这是否正是您所说的,但我在mysql解释空值并通过更改源文件来修复它时遇到了一些问题。我修改了源文件,将空白单元格替换为字符串"Null“。程序写入一个新的文件,所以您的初始文件应该是未修改的。所编写的文件并不完美,但可以轻松地在excel中进行修改,以获得正确的格式。然后,我使用一个本地幼稚将其重新加载到数据库中。希望这会有所帮助,如果您对代码有问题,请告诉我。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31592549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档