SQLite3数学函数Python

3
在更新 SQLite 版本为 3.5.0 之后,可以使用 SQL 数学函数。如果在 Pycharm 查询中使用它,则可以正常工作,但我无法在 Python 代码中执行查询。
然后,我收到以下错误消息: pandas.io.sql.DatabaseError: 在 'Select log(increase.s1) From increase' 上执行失败:没有这样的函数:log。
我使用以下代码执行它:
import pandas as pd

conn = sqlite3.connect('p1_database.db')

sql = "Select log(increase.s1) from increase"
pd.read_sql_query(sql, con=conn)

我的错误在哪里?我没有看到它。


2
以下数学函数是SQLite汇编源文件的一部分,但仅在使用-DSQLITE_ENABLE_MATH_FUNCTIONS编译时才处于活动状态。 - forpas
在哪里/如何设置选项? - Jume
数学函数是编译时的,因此需要内置二进制文件或可以从源代码编译。 - CodeMonkey
我可以确认,在Windows上,Python 3.7的sqlite3模块不支持log - Serge Ballesta
2个回答

7

标准Python库中的sqlite3模块不支持数学函数。但它允许很容易地创建新函数:

...
import math

conn = sqlite3.connect('p1_database.db')
conn.create_function('log', 1, math.log10)

sql = "Select log(increase.s1) from increase"
pd.read_sql_query(sql, con=conn)

应该可以胜任(我使用了math.log10, 因为Sqlite3的log函数实际上是以10为底的对数)。


0
如果在sqlite3模块中未启用数学函数,则可以对列应用对数函数并返回一系列结果。
import sqlite3
import pandas as pd
import math

with sqlite3.connect(":memory:") as conn:
    cur = conn.cursor()
    
    cur.execute("CREATE TABLE increase(s1 integer)")
    cur.execute("INSERT INTO increase (s1) values (1)")
    cur.execute("INSERT INTO increase (s1) values (2)")
    cur.execute("INSERT INTO increase (s1) values (100)")

    df = pd.read_sql_query('SELECT s1 FROM increase', conn)
    logseries = df['s1'].map(lambda x: math.log(x))
    log10series = df['s1'].map(lambda x: math.log10(x))
    for r in zip(df['s1'], logseries, log10series):
        print(f"{r[0]:3d} {r[1]:.3f} {r[2]:.3f}")

输出:

  1 0.000 0.000
  2 0.693 0.301
100 4.605 2.000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接