首页 > 解决方案 > 创建 SQL 插入脚本,返回:TypeError: +: 'NoneType' 和 'str' 不支持的操作数类型

问题描述

我有以下数据框。

df = pd.DataFrame({'vin': ['test'], 'modelId':['5641'], 'year': ['2021'] })

我正在尝试使用以下函数从中创建一个 SQL 插入脚本。

import pandas as pd
    def createSqlInsertStatement():
        global sql_texts,row
        sql_texts = []
        for index, row in df.iterrows():
            sql_texts.append('INSERT INTO '+ ' registry'+' (source, create_time, geo_group_id, status, make, vin, modelId, year)' 
            + ' VALUES "MANUAL_LOAD", sysdate, 42, 0, "MITSUBISHI", '+ ',' + str(tuple(row.values))) +';'
            return sql_texts

但我不断得到:

TypeError                                 Traceback (most recent call last)
c:\Users\Desktop\testsql.py in <module>
----> 1 createSqlInsertStatement()

c:\Users\Desktop\testsql.py in createSqlInsertStatement()
      9     sql_texts = []
     10     for index, row in df.iterrows():
---> 11         sql_texts.append('INSERT INTO '+ ' registry'+' (source, create_time, geo_group_id, status, make, vin, modelId, year)' 
     12         + ' VALUES "MANUAL_LOAD", sysdate, 42, 0, "MITSUBISHI", '+ ',' + str(tuple(row.values))) +';'
     13         return sql_texts

TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

我需要 ...

INSERT INTO registry (source, create_time, geo_group_id, status, make, vin, modelId, year) VALUES ('MANUAL_LOAD', sysdate, 42, 0, 'MITSUBISHI', '5641', '2021');

我要疯了,正在寻找我找不到的 none 类型,还是我看错了?

标签: python

解决方案


您的附加语句末尾有一个错误: +';'应该在“附加”的括号内。现在,您正试图将“追加”的结果与 string(character) 连接起来';'

更正为:

sql_texts.append('INSERT INTO '+ ' registry'+' (source, create_time, geo_group_id, status, make, vin, modelId, year)' 
            + ' VALUES "MANUAL_LOAD", sysdate, 42, 0, "MITSUBISHI", '+ ',' + str(tuple(row.values)) +';')

编辑:除了更正上面的语法错误之外,我相信您的代码不会为您提供您正在寻找的输出,因为您不希望将元组添加到您的字符串中。此语句可能更简洁(使用format函数而不是+

sql_texts.append("INSERT INTO registry (source, create_time, geo_group_id, status, make, vin, modelId, year) VALUES (\"MANUAL_LOAD\", sysdate, 42, 0, \"MITSUBISHI\", \"{0}\", \"{1}\");".format(row.values[1], row.values[2]))

这给出了输出:

['INSERT INTO registry (source, create_time, geo_group_id, status, make, vin, modelId, year) VALUES ("MANUAL_LOAD", sysdate, 42, 0, "MITSUBISHI", "5641", "2021");']

希望这可以帮助!


推荐阅读