跳转到主要内容

用于在SQLite数据库中运行列转换的工具。

项目描述

sqlite-transform

No longer maintained PyPI Changelog Tests License

用于在SQLite数据库中运行列转换的工具。

:warning: 此工具已不再维护

我在sqlite-utils中添加了一个新工具,名为sqlite-utils convert,它提供了此处最初提供功能的一个超集。sqlite-transform 已不再维护,我建议您切换到使用 sqlite-utils convert

如何安装

pip install sqlite-transform

parsedate 和 parsedatetime

这些子命令将指定的列中的所有值通过 dateutils.parser.parse() 运行,并用格式化为ISO时间戳或ISO日期的结果替换它们。

例如,如果数据库中的一行有一个包含 10/10/2019 08:10:00 PMopened 列,运行以下命令

sqlite-transform parsedatetime my.db mytable opened

将导致该值被替换为 2019-10-10T20:10:00

在此处使用 parsedate 子命令将导致 2019-10-10

在像 03/04/05 这样的模糊日期的情况下,这两个命令都默认假设美国风格的 mm/dd/yy 格式。您可以通过传递 --dayfirst 指定天应该被假设为第一,或者通过 --yearfirst 指定年。

jsonsplit

jsonsplit 子命令接受包含以逗号分隔的列表的列,例如包含 "trees,park,dogs" 等记录的 tags 列,并将其转换为JSON数组 ["trees", "park", "dogs"]

这对于利用Datasette的按JSON数组进行切面功能很有用。

sqlite-transform jsonsplit my.db mytable tags

它默认以逗号分隔,但您可以使用 --delimiter 选项指定不同的分隔符字符,例如

sqlite-transform jsonsplit \
    my.db mytable tags --delimiter ';'

数组内的值将被视为字符串,因此包含 123,552,775 的列将被转换为JSON数组 ["123", "552", "775"]

您可以使用 --type int--type float 指定这些值的类型,例如

sqlite-transform jsonsplit \
    my.db mytable tags --type int

这将导致该列被转换为[123, 552, 775]

lambda执行您的代码

lambda子命令允许您指定要针对该列执行的Python代码。

以下是将列转换为上档字符的方法

sqlite-transform lambda my.db mytable mycolumn --code='str(value).upper()'

您提供的代码将被编译成一个函数,该函数以value作为单个参数。您可以将函数体分成多行,只要最后一行是return语句即可

sqlite-transform lambda my.db mytable mycolumn --code='value = str(value)
return value.upper()'

您还可以使用一个或多个--import选项指定要导入并使您的代码可用的Python模块

sqlite-transform lambda my.db mytable mycolumn \
    --code='"\n".join(textwrap.wrap(value, 10))' \
    --import=textwrap

--dry-run选项将输出对前十个行的转换预览,而不修改数据库。

将结果保存到单独的列中

每个这些命令都接受可选的--output--output-type选项。这些选项可以用于将转换结果保存到单独的列,如果该列不存在,则会创建该列。

要将jsonsplit的结果保存到名为json_tags的新列中,请使用以下内容

sqlite-transform jsonsplit my.db mytable tags \
  --output json_tags

新列的类型默认为text,但可以使用--output-type指定不同的列类型。此示例将创建一个名为float_id的新浮点列,每个项目的ID增加0.5

sqlite-transform lambda my.db mytable id \
  --code 'float(value) + 0.5' \
  --output float_id \
  --output-type float

您可以通过添加--drop在操作结束时删除原始列。

将列拆分为多个列

有时您可能希望将单个列转换为多个派生列。例如,您可能有一个包含latitude,longitude值的location列,您希望将其拆分为单独的latitudelongitude列。

您可以使用sqlite-transform lambda--multi选项来实现这一点。此选项期望您的--code函数返回一个Python字典:将为字典中的每个键创建并填充新列。

对于latitude,longitude示例,您将使用以下内容

sqlite-transform lambda demo.db places location \
  --code 'return {
    "latitude": float(value.split(",")[0]),
    "longitude": float(value.split(",")[1]),
  }' --multi

当创建新列时,会考虑返回值的类型。在此示例中,生成的数据库模式将如下所示

CREATE TABLE [places] (
    [location] TEXT,
    [latitude] FLOAT,
    [longitude] FLOAT
);

代码函数还可以返回None,在这种情况下,其输出将被忽略。

您可以通过添加--drop在操作结束时删除原始列。

禁用进度条

默认情况下,每个命令都会显示进度条。通过传递-s--silent来隐藏该进度条。

项目详情


下载文件

下载适合您的平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

sqlite-transform-1.2.1.tar.gz (11.1 kB 查看哈希)

上传时间

构建分发

sqlite_transform-1.2.1-py3-none-any.whl (11.2 kB 查看哈希)

上传时间 Python 3

由以下支持