1

我希望每天从 KDB 中已经每天更新的表中更新 SQL Server 中的表。我已经将 ny SQL 数据库连接到 python 并计划对 KDB 数据库执行相同的操作,但我不确定下一步是让 KDB 表更新 SQL 表。

到目前为止,这是我成功连接到数据库的代码

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() 
4

2 回答 2

1

因此,虽然您可以在这里使用 Python 作为中介,但为什么要麻烦呢?您可以改为在 kdb+ 中使用本机的 ODBC 驱动程序,如此所述。

您需要编写一些内容来创建用于插入、选择等的查询字符串,但这很容易完成。

如果你真的必须使用 Python,exxeleron 的 qpython 包是处理 python <-> q IPC 的最简单方法(你可以像上面一样使用 pyQ,但如果你对使用 Python 很执着,那么你可能只需要一个插件 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
于 2017-06-16T08:17:50.677 回答
0

如果您可以使用PyQ,那么从 kdb+ 表中获取数据是微不足道的。假设您有一个名为的表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)]

可以使用以下方法将此列表发送到 SQL 服务器executemany

cur.executemany("insert into t(a, b) values (?, ?)", data)
于 2017-06-17T01:39:11.347 回答