用于在SQLite数据库中运行列转换的工具。
项目描述
sqlite-transform
用于在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 PM
的 opened
列,运行以下命令
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
列,您希望将其拆分为单独的latitude
和longitude
列。
您可以使用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
来隐藏该进度条。
项目详情
下载文件
下载适合您的平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。