如何将Python None设置为db3 Null

时间:2016-04-26 15:30:59

标签: python sqlite

我在Python值中有以下值:

_sfwBIPMKEeCTfuMZpaDEBQ Atomic Warehouse Model None

这些值通过函数发送,并被放入db3表中,如下所示:

INSERT INTO [PackageRoster] (PkgID, Package, PkgParentID) VALUES ('_sfwBIPMKEeCTfuMZpaDEBQ', 'Atomic Warehouse Model', 'None');

我不想要字符串'无'放进桌子。我想要NULL。 如何告诉Python注入NULL而不是None?

这是使用该语句的功能(包括调试功能):

def StorePackage(PkgID, Package, PkgParentID):
    dbutils.ResetTable()
    conn = sqlite3.connect(dbutils.db)
    try:
        conn.execute("INSERT INTO " + dbutils.table + " (PkgID, Package, PkgParentID) VALUES ('" + PkgID + "', '" + Package + "', '" + PkgParentID + "');")
    except:
        print("INSERT INTO " + dbutils.table + " (PkgID, Package, PkgParentID) VALUES ('" + PkgID + "', '" + Package + "', '" + str(PkgParentID) + "');")
    conn.commit()

由于

2 个答案:

答案 0 :(得分:1)

您正在将所有值转换为字符串,因为您在它们周围添加了引号。即,因为你做'" + str(PkgParentID) + "',它最终会以'None'代替None

例如,您应该在查询之前将值转换为字符串,并在它们为None时将其替换为NULL

def StorePackage(PkgID, Package, PkgParentID):
    PkgParentID = "'{}'".format(PkgParentID) if PkgParentID is not None else "NULL"
    # Same for other parameters if desired

    dbutils.ResetTable()
    conn = sqlite3.connect(dbutils.db)
    query = "INSERT INTO " + dbutils.table + " (PkgID, Package, PkgParentID) VALUES ('" + PkgID + "', '" + Package + "', " + PkgParentID + ");"
    try:
        conn.execute(query)
    except:
        print(query)
    conn.commit()

此外,您应该使用parameter substitution,,尽管这不是导致您首先出现问题的原因

答案 1 :(得分:1)

我最初评论了使用参数替换的建议,假设它实际上并不相关。但是,在进一步检查时,我认为这正是您正在寻找的。

您的代码当前插入了所有字符串,因为您在Python中将所有内容显式转换为字符串。参数替换使Python能够处理如何将其值传入数据库,还可以保护您免受SQL注入攻击。

    if (logger.isDebugEnabled()) {
        logger.debug(methods.size() + " request handler methods found on " + userType + ": " + methods);
    }

使用此方法将Python conn.execute("INSERT INTO " + dbutils.table + " (PkgID, Package, PkgParentID) VALUES (?,?,?)", (PkgID, Package, PkgParentID)) 对象作为SQLite None插入。您可以在the docs中阅读有关参数替换的更多信息,以及Python值如何转换为SQLite值,反之亦然。