2017-06-15 2 views
1

Je voudrais avoir une table dans SQL Server mise à jour quotidienne d'une table qui est déjà mise à jour quotidiennement dans KDB. J'ai connecté ny base de données SQL à python et prévu de faire la même chose avec la base de données KDB mais je ne suis pas sûr de ce que ma prochaine étape serait d'avoir la table KDB mettre à jour la table SQL.Mise à jour de la table de KDB + à SQL Server en utilisant Python

Voici mon code à ce jour qui se connecte avec succès à la base de données

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

Je ne suis pas entièrement sûr que c'est une question appropriée. On dirait que vous avez vraiment besoin de lire la documentation de KDB +? Il semble y avoir une bibliothèque Python pertinente (http://code.kx.com/wiki/Contrib/PyQ#PyQ:_Python_Integration). Cela résoudrait «l'accès» à l'instance KDB +. Ensuite, vous devez comprendre les mappages d'une base de données à l'autre, et cela devrait le faire. – selllikesybok

Répondre

1

Ainsi, alors que vous pouvez utiliser Python comme intermédiaire ici, pourquoi la peine? Vous pouvez utiliser nativement le pilote ODBC dans kdb + comme expliqué here.

Vous aurez besoin d'écrire quelque chose pour créer vos querystrings pour l'insertion, la sélection, etc., mais c'est assez facile à faire.

Si vous avez vraiment doit utiliser Python, exxeleron's qpython package est la meilleure façon pour le traitement python < -> q IPC (vous pouvez utiliser PYQ comme ci-dessus, mais si vous êtes DEADSET sur l'utilisation de Python, vous voulez probablement seulement plug- dans le module 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

Si vous pouvez utiliser PyQ, aller chercher ensuite les données à partir KDB + tables est trivial. Supposons que vous avez une table appelée 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 

Pour convertir ces données à une liste de tuples qui peut être envoyé sur pyodbc, simplement itérer sur la table dans une compréhension de la liste:

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

Cette liste peut être envoyé le serveur SQL en utilisant la méthode executemany:

cur.executemany("insert into t(a, b) values (?, ?)", data)