我在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()
由于
答案 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)
我最初评论了使用参数替换的建议,假设它实际上并不相关。但是,在进一步检查时,我认为这正是您正在寻找的。 p>
您的代码当前插入了所有字符串,因为您在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值,反之亦然。