Python/pypyODBC:使用字符串和NULL插入行

m3m*_*5rr 4 python xml sql-server pypyodbc

我对Python很陌生,并且在这个当前项目之前还没有真正与SQL Server和XML Parsing进行交互(可能甚至不是最好的方法).简而言之,我的IT团队非常回溯,我需要将数据放入沙箱表(从XML解析).

有一段XML包含属性[xx] 001到[xx] 025.并非所有这些属性都包含在我将要解析的每个XML中.因此,我遍历所有可能属性的循环并将结果附加到列表中.由于并非所有属性都在每个XML中,因此我可以通过尝试表示每个属性来生成noneTypes.在创建我的SQL插入语句之前,我需要将它们转换为NULL,这不是问题.可能有一些非常简单的方法来解决这个问题,但我的新手状态阻碍了我的进步.相关的代码片段如下......

也许总的来说有更好的方法吗?我担心sqlList可能只能在达到限制之前变得如此之大.

#this list contains Nones
sqlList = (", ".join(map(repr,appendedList)))

#the Nones are an issue when I get to here
curs.execute("USE Sandbox INSERT INTO myTable VALUES (%s)" % (sqlList))
curs.commit()
Run Code Online (Sandbox Code Playgroud)

以下是sqlList的示例:

'20_2014', '20_2014_3/25/2015 2:01 PM', 'FBR', 'A', '0', '0', '3', '1', '134', None, None, '0', None, '0', '0', '0', '0', '0', None, None, '2', None, None, None, None
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

pypyodbc.ProgrammingError: ('42S22', "[42S22] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'None'.")
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 8

一般来说,我们仍然想知道这是否是"正确"的方式.

您的解决方案仍然是动态SQL,它总是受到影响

  • SQL注入问题(例如,如果其中一个字符串包含单引号怎么办?),
  • 类型杂耍(例如,你的问题中没有 - > NULL),
  • 必须为您的文字值(字符串,日期等)使用正确的分隔符

如果使用参数化查询,所有这些问题都会消失.此示例仅使用2个属性(而不是问题中的25个),但原理完全相同.请注意,我没有必要做任何特殊的处理None值,以便将它们作为NULL插入.

import pypyodbc
myData = [
    (1, 'foo'),
    (2, None),
    (3, 'bar'),
    ]
connStr = """
DSN=myDb_SQLEXPRESS;
"""
cnxn = pypyodbc.connect(connStr)
crsr = cnxn.cursor()
sql = """
INSERT INTO myTable VALUES (?, ?)
"""
for dataRow in myData:
    print(dataRow)
    crsr.execute(sql, dataRow)
cnxn.commit()
crsr.close()
cnxn.close()
Run Code Online (Sandbox Code Playgroud)

控制台输出是......

(1, 'foo')
(2, None)
(3, 'bar')
Run Code Online (Sandbox Code Playgroud)

...并且正确地将三行插入表中,包括第二行中的NULL(无).

  • 好答案.你也可以删除`for`循环并使用`crsr.executemany(sql,myData)`. (2认同)