Python: 无法连接str和NoneType对象

5 投票
5 回答
9116 浏览
提问于 2025-04-16 00:06
sql = """
        INSERT INTO [SCHOOLINFO] 
        VALUES(
            '""" + self.accountNo + """', 
            '""" + self.altName + """',
            '""" + self.address1 + """',
            '""" + self.address2 + """',
            '""" + self.city + """',
            '""" + self.state + """',
            '""" + self.zipCode + """',
            '""" + self.phone1 + """',
            '""" + self.phone2 + """',
            '""" + self.fax + """',
            '""" + self.contactName + """',
            '""" + self.contactEmail + """',
            '""" + self.prize_id + """',
            '""" + self.shipping + """',
            '""" + self.chairTempPass + """',
            '""" + self.studentCount + """'
        )
    """;

我有以下代码,但是Python一直报错,说它不能把字符串和NoneType对象连接在一起。问题是我已经确认这里的每个变量实际上都是字符串,并且不是空的。我今天在这个问题上卡了很久,非常希望能得到一些帮助。

5 个回答

1

我假设你正在使用像 MySQLdb 这样的库。处理这类语句的最佳方法是这样的:

import _mysql

db = _mysql.connect("localhost","user","password","database_name")
cursor = db.cursor()

sql = """
    INSERT INTO [SCHOOLINFO] 
    VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
"""
cursor.execute(sql, [self.accountNo, self.altName, self.address1, \
                     self.address2, self.city, self.state, self.zipCode, \
                     self.phone1, self.phone2, self.fax, self.contactName, \
                     self.contactEmail, self.prize_id, self.shipping, \
                     self.chairTempPass, self.studentCount])

这样,数据库库会正确地将值放入 INSERT 查询中。它甚至会把 None 值作为 NULL 插入到新行中。而你之前的做法很容易受到 SQL 注入攻击。

如果你不是在使用 mysql,你的库可能也有类似的功能。

编辑 -

如果你是连接到 SQL Server 数据库,使用 pyodbc 库。你可以在 http://code.google.com/p/pyodbc/ 找到它。下面是代码的样子:

import pyodbc

conn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=database_name;UID=user;PWD=password')
cursor = conn.cursor()

sql = """
    INSERT INTO [SCHOOLINFO] 
    VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
cursor.execute(sql, self.accountNo, self.altName, self.address1, \
                     self.address2, self.city, self.state, self.zipCode, \
                     self.phone1, self.phone2, self.fax, self.contactName, \
                     self.contactEmail, self.prize_id, self.shipping, \
                     self.chairTempPass, self.studentCount)
conn.commit()
3

到目前为止,所有的回答都在讨论应该怎么做,而不是解决你的问题。没错,使用绑定变量更好也更安全。而且,使用 % 来格式化数据速度更快,效果也可能更好。

但是,针对你提到的错误,原因一定是某个值在某个时刻是 None,这没有其他解释。你可以在出错的地方加个调试打印,比如:

for v in 'accountNo altName address1 address2 city state zipCode phone1 phone2 fax contactName contactEmail prize_id shipping chairTempPass studentCount'.split():
    if getattr(self, v) is None:
        print 'PANIC: %s is None' % v

我敢打赌,某个时刻它会打印出一些东西 ;-)

4

建议使用绑定变量。这里有关于在Python中与数据库打交道的规范:PEP 249: Python数据库API规范v2.0

更新:根据pymssql的文档,你需要类似下面的代码:

sql = """
    INSERT INTO [SCHOOLINFO] 
    VALUES(
        %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %d
    )"""
cur.execute(sql, self.accountNo, self.altName, self.address1, self.address2, self.city, self.state, self.zipCode, self.phone1, self.phone2, self.fax, self.contactName, self.contactEmail, self.prize_id, self.shipping, self.chairTempPass, self.studentCount)

撰写回答