6

私は Python を初めて使用し、この現在のプロジェクトまで SQL Server と XML 解析を実際に操作したことがありません (最善のアプローチでさえないかもしれません)。簡単に言えば、私の IT チームは非常に未処理であり、データを (XML から解析して) サンドボックス テーブルに入れる必要があります。

属性 [xx]001 から [xx]025 を含む XML のセグメントがあります。解析する XML ごとに、これらの属性のすべてが含まれているわけではありません。したがって、考えられるすべての属性のループを繰り返し、結果をリストに追加します。すべての属性が各 XML に含まれているわけではないため、それぞれを表現しようとすると、noneTypes が発生する可能性があります。NULLに変換する必要があるSQL挿入ステートメントを作成するまでは問題ありません。おそらくこれを処理するための非常に簡単な方法がいくつかありますが、私の初心者のステータスが私の進歩を妨げています. コードの関連部分は次のとおりです...

たぶん、一般的にそれを行うためのより良い方法はありますか?私も同様に制限に達する前に、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()

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

次のエラー メッセージが表示されます。

pypyodbc.ProgrammingError: ('42S22', "[42S22] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'None'.")
4

2 に答える 2

12

一般的に、これがこれを行う「正しい」方法であるかどうかを知りたいです。

あなたのソリューションはまだDynamic SQLであり、常に苦しんでいます

  • SQL インジェクションの問題 (例: 文字列の 1 つに一重引用符が含まれている場合は?)、
  • ジャグリングと入力します(たとえば、質問のように None -> NULL )、
  • リテラル値 (文字列、日付など) に正しい区切り文字を使用する必要がある

パラメータ化されたクエリを使用すると、これらの問題はすべてなくなります。この例では、明確にするために(質問の25ではなく)2つの属性のみを使用していますが、原則はまったく同じです。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()

コンソール出力は...

(1, 'foo')
(2, None)
(3, 'bar')

...そして、2行目のNULL(なし)を含め、3行がテーブルに正しく挿入されます。

于 2015-04-02T17:59:03.777 に答える