执行命令与管理连接
连接建立后,可以通过 exec() 执行 DolphinDB 脚本,通过 call() 调用服务端函数,并使用
upload() 将 Python 数据上传到服务端。run()
作为兼容接口保留,可继续用于脚本执行和函数调用。连接使用完毕后,应调用 close() 释放资源。
同一连接上的命令会按调用顺序执行。多个线程同时使用同一连接发起命令时,后续调用需要等待当前命令完成;如需并发执行,应使用连接池。使用分段读取时,必须先读取完当前结果集,或主动放弃剩余数据,才能继续在该连接上执行后续命令。
exec:执行脚本
使用 exec() 执行一段 DolphinDB 脚本,并返回脚本执行结果。
def exec(
self,
script,
*,
clear_memory=False,
table_to_list=False,
priority=4,
parallelism=64,
fetch_size=None,
disable_decimal=False,
) -> object: ...
脚本参数 script
-
script:必填参数,用于指定待执行的 DolphinDB 脚本,可以是表达式、查询语句,也可以包含多条以分号分隔的语句。
conn.exec("x = 1..10")
print(conn.exec("sum(x)"))
# 输出:55
内存参数 clear_memory
-
clear_memory:可选参数,用于指定请求完成后是否释放本次请求在会话中创建的变量,默认值为 False。
设为 True 时,适合执行不需要在后续请求中复用中间变量的脚本。
conn.exec("temporary = 1..100", clear_memory=True)
表转换参数 table_to_list
-
table_to_list:可选参数,用于指定是否将表结果按列转换为 list,仅对 DDB 和 PICKLE 协议有效,默认值为 False。
注意:在 DDB 协议下,若表中包含数组向量(array vector,即元素为向量的列),开启该选项后会将其转换为二维数组。这要求该列各行的向量长度必须完全一致,否则会导致转换失败。
columns = conn.exec(
"table(1..3 as id, `A`B`C as sym)",
table_to_list=True,
)
print(columns[0])
# 输出:[1 2 3]
作业参数 priority, parallelism
-
priority:可选参数,用于指定作业优先级,取值范围为 0 到 9,取值越高表示任务执行的优先级越高。默认值为 4。
-
parallelism:可选参数,用于指定单个数据节点上执行该作业子任务的最大线程数,必须大于 0,默认值为 64。
priority 的实际值不超过服务端 setMaxJobPriority
设置的上限;parallelism 的实际值不超过服务端 setMaxJobParallelism
设置的上限。
result = conn.exec(
"sum(1..1000000)",
priority=7,
parallelism=16,
)
分段读取参数 fetch_size 与 BlockReader 接口
-
fetch_size:可选参数,用于指定分段读取时每段返回的记录数,应为不小于 8192 的整数,默认值为 None。
指定后,exec() 返回
BlockReader,而不是一次性返回完整结果。该参数仅用于返回表的脚本。
分段读取的每一段表数据返回 pandas.DataFrame,不按构造时的 Arrow 或 PICKLE 协议转换结果;当前也不会应用
table_to_list 和 disable_decimal 参数。需要这些转换选项时,应使用普通查询。
conn.exec("testblock = table(1..20000 as id)")
block = conn.exec("select * from testblock", fetch_size=8192)
total = 0
try:
for data in block:
total += len(data)
finally:
block.skip_all()
print(total)
# 输出:20000
BlockReader 接口 |
说明 |
|---|---|
read() |
读取下一段数据;全部读取后自动解除连接的分段读取状态 |
has_next |
是否仍有未读取数据 |
hasNext() |
has_next 的兼容方法 |
skip_all() |
放弃所有未读取数据,并解除连接的分段读取状态 |
skipAll() |
skip_all() 的兼容方法 |
全部数据读取完毕前,同一连接不能执行其他命令。若不再需要剩余数据,必须调用 skip_all():
block = conn.exec("select * from testblock", fetch_size=8192)
first_block = block.read()
block.skip_all()
print(conn.exec("1 + 1"))
# 输出:2
注意:
-
使用 fetch_size 分段读取时,fetch_size 必须大于或等于 8192,且执行的脚本结果必须为表。异步模式下请勿指定 fetch_size。
-
若在获取
BlockReader之前发生异常(例如参数非法或结果类型不匹配),该连接将无法继续执行其他操作。此时建议调用close()关闭当前连接并重新创建,避免复用该连接。
DECIMAL 转换参数 disable_decimal
-
disable_decimal:可选参数,控制是否将结果表中的 DECIMAL 列转换为 DOUBLE。默认值为 False,即保留 DECIMAL 类型。
当设置为 True 时,结果表中的 DECIMAL 列会转换为 DOUBLE。该参数需配合 DolphinDB 2.00.12.3、3.00.1 或更高版本使用;客户端不会预先校验服务端版本。详见官方常用方法说明。
result = conn.exec(
"table(decimal32([1.23, 2.345], 3) as value)",
disable_decimal=True,
)
print(result.dtypes)
# value float64
exec 返回值与异常
-
未指定 fetch_size 时,
exec()返回脚本执行结果;具体 Python 类型取决于 DolphinDB 数据形式和当前协议。 -
同步模式下指定 fetch_size 时,返回
BlockReader,用于分段读取表结果。 -
启用异步模式(
enable_async=True)时,请求发送后不等待服务端响应,返回 None。 -
priority 不在 0 到 9 范围内、parallelism 不是正整数、fetch_size 小于 8192,或服务端脚本执行失败时,通常抛出
RuntimeError。 -
上一个
BlockReader尚未读取完毕且未调用skip_all()放弃剩余数据时,在同一连接上继续执行exec()、call()、run()、upload()或读取 is_alive,通常会抛出RuntimeError。
call:调用函数
使用 call() 调用 DolphinDB 内置函数或服务端已定义的用户自定义函数。
def call(
self,
func,
*args,
clear_memory=False,
table_to_list=False,
priority=4,
parallelism=64,
disable_decimal=False,
) -> object: ...
-
func:必填参数,用于指定要调用的 DolphinDB 内置函数或用户自定义函数名称。
-
args:可选参数,用于按顺序传入服务端函数的位置参数。
其余参数与 exec() 中的同名参数含义相同;call() 不支持
fetch_size,不能用于分段读取结果。
print(conn.call("sum", [1, 2, 3]))
print(conn.call("add", 1, 2))
# 输出:6
# 输出:3
call("functionName"):conn.exec("def answer(){ return 42; }")
print(conn.call("answer"))
# 输出:42函数不存在、服务端参数校验失败、权限不足或函数执行失败时,通常抛出 RuntimeError;Python 调用签名不匹配时,抛出
TypeError。
run:统一执行入口
run() 是兼容入口,根据是否传入函数参数,将请求分派给 exec() 或
call()。
-
script:必填参数,用于指定待执行的脚本,或在传入函数参数时指定要调用的服务端函数名。
-
args:可选参数,用于决定
run()的调用模式,并作为位置参数传给服务端函数。 -
kwargs:可选参数,用于传入
exec()或call()支持的同名关键字参数。
def run(self, script, *args, **kwargs) -> object: ...
-
未传入 args 时,等价于
exec(script, **kwargs)。 -
传入一个或多个 args 时,等价于
call(script, *args, **kwargs)。
print(conn.run("1 + 1"))
print(conn.run("add", 1, 2))
# 输出:2
# 输出:3
fetch_size 仅适用于未传入 args 的脚本执行模式;如果在函数调用模式下传入 fetch_size,将抛出
TypeError。
调用无参数函数时,请使用 call("functionName") 或
exec("functionName()")。run("functionName")
会将函数名按脚本内容执行,并不会自动调用该函数。
upload:上传数据
upload() 将 Python 对象上传到当前 DolphinDB
会话,并在服务端创建同名变量。def upload(self, objs): ...-
objs:必填参数,用于指定要上传的变量集合,必须为字典。
pandas.DataFrame、numpy.ndarray
等可转换的 Python 对象。其中,pandas.DataFrame 会上传为 DolphinDB
表。conn.upload({"a": 8, "b": "abc"})
print(conn.run("a"))
# 输出:8上传成功后,变量保存在当前服务端会话中,可在后续脚本或函数调用中直接使用。同步模式下,上传成功返回服务端对象地址;传入空字典或启用异步模式时,当前实现返回
-1。变量名非法、对象类型不受支持或服务端拒绝上传时,通常抛出 RuntimeError。login:登录或切换用户
login() 在已建立的连接上登录
DolphinDB,或将当前连接切换到其他用户。连接时未提供登录信息,或后续需要更换用户身份时,可以调用该方法。def login(self, userid, password, enable_encryption=True) -> None: ...-
userid:必填参数,用于指定登录 DolphinDB 的用户名。
-
password:必填参数,用于指定对应用户的登录密码。
-
enable_encryption:可选参数,指定在传输用户登录凭据时是否启用加密,默认值为 True。
enable_ssl=True 并启用服务端
SSL。conn = ddb.DBConnection()
conn.connect("localhost", 8848)
conn.login("admin", "your_password")登录成功时返回
None。认证失败、连接不可用或服务端拒绝登录时,通常抛出 RuntimeError。close:关闭连接
close()
关闭当前连接并释放相关网络资源。连接不再使用时,应显式调用该方法。def close(self) -> None: ...close() 可以重复调用。对象析构时也会尝试关闭连接,但不应依赖 Python 垃圾回收及时释放资源;推荐使用
try...finally 确保连接最终被关闭。
skip_all() 放弃剩余数据。避免在其他线程仍在使用该连接时调用
close()。conn = ddb.DBConnection()
try:
if not conn.connect("localhost", 8848):
raise RuntimeError("Failed to connect to DolphinDB")
print(conn.exec("1 + 1"))
finally:
conn.close()