如何使用可选参数创建用户定义的 SQLite 函数

发布于 2025-01-09 15:22:06 字数 339 浏览 0 评论 0原文

我正在尝试用 Python 扩展 SQLite。所以我有其中几个:

connection.create_function("MICROSECONDS_SUB", 2, microseconds_sub)

对应于 python 实现:

def microseconds_sub(date, microseconds)
    # some kind of logic to subtract microseconds from a date

我希望能够提供可以接受可选参数的函数(例如,两个必需参数和第三个可选参数),但我不确定如何提供。

I'm trying to extend SQLite in Python. So I have several of these:

connection.create_function("MICROSECONDS_SUB", 2, microseconds_sub)

corresponding to python implementations:

def microseconds_sub(date, microseconds)
    # some kind of logic to subtract microseconds from a date

I'd like to be able to supply functions that can take optional arguments (for example, two required arguments and a third optional one), but I'm not sure how.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

顾忌 2025-01-16 15:22:06

您可以传递 -1 作为参数数量,以防止 SQLite 对参数数量进行任何验证。

如果函数接受传递给它的任何内容,则调用将成功,否则,它将抛出 sqlite3.OperationalError。

import sqlite3
def microseconds_sub(date, microseconds=-1):
    return f"Called with ({date}, {microseconds})"
db = sqlite3.connect(":memory:")
db.create_function("MICROSECONDS_SUB", -1, microseconds_sub)

print(db.execute("SELECT MICROSECONDS_SUB('1234-12-12');").fetchone()[0])
# Called with (1234-12-12, -1)
print(db.execute("SELECT MICROSECONDS_SUB('1234-12-12', 42);").fetchone()[0])
# Called with (1234-12-12, 42)

# This next line will raise sqlite3.OperationalError
print(db.execute("SELECT MICROSECONDS_SUB('1234-12-12', 42, 'Boom');").fetchone()[0])

You can pass -1 for the number of arguments to prevent SQLite from doing any verification on the number of arguments.

If the function accepts whatever is passed to it, then the call will succeed, otherwise, it'll throw a sqlite3.OperationalError.

import sqlite3
def microseconds_sub(date, microseconds=-1):
    return f"Called with ({date}, {microseconds})"
db = sqlite3.connect(":memory:")
db.create_function("MICROSECONDS_SUB", -1, microseconds_sub)

print(db.execute("SELECT MICROSECONDS_SUB('1234-12-12');").fetchone()[0])
# Called with (1234-12-12, -1)
print(db.execute("SELECT MICROSECONDS_SUB('1234-12-12', 42);").fetchone()[0])
# Called with (1234-12-12, 42)

# This next line will raise sqlite3.OperationalError
print(db.execute("SELECT MICROSECONDS_SUB('1234-12-12', 42, 'Boom');").fetchone()[0])

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文