2017-06-15 11 views
1

私は、毎日KDBで毎日更新されているテーブルからSQLサーバーの更新プログラムを毎日更新したいと考えています。私はPythonにny SQLデータベースを接続し、KDBデータベースでも同じことを実行する予定ですが、私の次のステップは、KDBテーブルにSQLテーブルを更新させることです。ここで Pythonを使用してKDB +からSQL Serverにテーブルを更新

は私のコードは、これまでのところ成功したデータベース

import pyodbc 
db = pyodbc.connect(
    r'DRIVER={SQL Server Native Client 10.0};' 
    r'SERVER=serverName;' 
    r'DATABASE=DBName;' 
    r'UID=UN;' 
    r'PWD=PW') 
cur = db.cursor() 
SQLCommand = ("SELECT * " 
       "FROM Table1") 
cur.execute(SQLCommand) 
results = cur.fetchone() 
while results: 
    results = cur.fetchall() 
+0

これは適切な質問ではありません。実際にKDB +のドキュメントを読む必要があるようですか?関連するPythonライブラリ(http://code.kx.com/wiki/Contrib/PyQ#PyQ:_Python_Integration)があるようです。それはKDB +インスタンスへの「アクセス」を解決します。次に、あるデータベースから別のデータベースへのマッピングを把握しなければなりません。 – selllikesybok

答えて

1

に接続しているあなたはここ仲介としてPythonを使用することができますが、なぜわざわざでしょうか?代わりに、説明されたhereのように、kdb +でネイティブにODBCドライバを使用することができます。

挿入、選択などのためにクエリーストリングを作成するには何かを書く必要がありますが、これはかなり簡単です。

あなたは本当にexxeleron's qpython packageのpython <を処理するための最も簡単な方法です、パイソンを使用する必要がある場合 - あなたは上記のようpyQを使用することができます(> Q IPCしかし、あなたは、Pythonを使って上のdeadsetしている場合、あなたはおそらく唯一のプラグインが欲しいですPythonモジュールで)。

\l odbc.k 
odbcHandle: .odbc.open"Driver={SQL Server Native Client 10.0};SERVER=serverName;DATABASE=DBName;UID=UN;PWD=PW"; 
makeCall: .odbc.eval[odbcHandle]; 
data: makeCall"SELECT * FROM tableName"; 
countQuery:"SELECT COUNT(*) AS ct FROM otherTable"; 
ct: first exec ct from makeCall countQuery; 
makeCall"INSERT INTO otherTable (col1, col2) VALUES ('a', 'b');"; //you can also generate this string dynamically - this is an exercise for the reader 
ct2: first exec ct from makeCall countQuery; 
ct - ct2; // 1 
.odbc.close odbcHandle 
0

あなたはその後、KDB +テーブルからデータを取り出し、PyQを使用できる場合は簡単です。あなたはテーブルがあるとしtと呼ば:

>>> from pyq import q 
>>> q.load(':/path/to/t') # if t is not already loaded 
>>> q.t.show() 
a b 
---- 
1 10 
2 20 
3 30 
4 40 
5 50 

単にリスト内包でテーブルを反復、PyODBCを介して送信されることができるタプルのリストにこのデータを変換するには:

>>> data = [tuple(row.value) for row in q.t] 
>>> data 
[(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)] 

このリストexecutemanyメソッドを使用してSQLサーバーに送信できます。

cur.executemany("insert into t(a, b) values (?, ?)", data) 
関連する問題