使用新的InfluxDB 3.0 Python CLI和客户库库
Jay Clifford
好吧,我们回来了第2部分!上次我们讨论了新的Community Python图书馆,用于InfuxdB 3.0。让我们谈谈使用客户端库作为其开发的核心InfluxDB 3.0 Python CLI。
Python Cli
好吧,遵循与以前相同的格式,建造CLI的原因是什么?好吧,有两个主要原因:
- 我们想为用户提供一个利用新飞行端点的数据浏览工具。 Python为我们提供了在我们投资更强大的CLI产品之前快速原型的机会。它还使我们能够利用一些有趣的数据操纵库,这些库可以扩展Python CLI的范围。
- 我们想要一种可靠的方法来测试新创建的InfluxDB 3.0 Python Client library,因为您将看到使用中的大多数工具和功能。
安装
让我们谈谈安装过程,因为我必须承认,除非您每天使用它,否则Python不会提供最友好的包装和部署方法。我建议首先在Python虚拟环境中安装CLI以进行测试:
$ python3 -m venv ./.venv
$ source .venv/bin/activate
$ pip install –upgrade pip
$ pip install influxdb3-python-cli
这组命令创建了我们的虚拟Python环境,激活它,更新我们的Python软件包安装程序,最后安装了新的CLI。
如果您想从Python虚拟环境毕业并将CLI移至您的路径,则可以使用Sudo安装(您必须小心在这里不要引起包裹的许可问题):
sudo python3 -m pip install influxdb3-python-cli
创建CLI配置
您要做的第一件事是创建一个连接配置。此功能的作用类似于当前的InfluxDB influx
CLI,通过保存您的连接凭证供infuxdb稍后使用。
influx3 create config \
--name="poke-dex" \
--database="pokemon-codex" \
--host="us-east-1-1.aws.cloud2.influxdata.com" \
--token="<your token>" \
--org="<your org ID>"
名称 | 名称描述您的连接配置。这一定是唯一的。 |
token | 这为客户提供了从infuxdb cloud Serverless或Dedicated读写的身份验证。注意:如果您想使用这两个功能,则需要带有读取和写下身份验证的令牌。 |
主持人 | infuxdb主机 - 这只能是没有协议的域(https://) |
org | Cloud无服务器仍然需要用户的组织ID来将数据写入3.0。专用的用户只能使用任意字符串。 |
数据库 | 您希望从中查询并写入的数据库。 |
配置命令
配置命令也存在激活,更新,删除和列表当前活动配置:
````bash
Influx3.py配置更新-name =“ poke-dex” -honst =“ new-host.com” ```````` |
更新子命令更新现有配置。需要 - 名称参数才能指定要更新的配置。所有其他参数( - 主持, - token, - 数据库,-org,Active)都是可选的。 |
````bash
Influx3.py配置使用-name =“ poke-dex” ```````` |
使用子命令将特定的配置设置为有效配置。需要 - 名称参数来指定要使用的配置。 |
````bash
infux3.py config delete -name =“ poke-dex” ```````` |
删除子命令删除配置。需要 - 名称参数才能指定要删除的配置。 |
````bash
Influx3.py配置列表 ```````` |
列表子命令列出了所有配置。 |
写作和查询
您可以使用CLI直接调用该应用程序,然后使用您希望运行的命令,也可以通过交互式REPL运行。我个人认为,复制方法提供了更好的流程,所以让演示一些功能。
创建了配置后,您只需输入以下即可激活repl:
influx3
导致:
influx3
InfluxDB 3.0 CLI.
(>)
询问
让我们首先查看查询选项。在REPL中,您有3个查询选项:SQL,InfluxQl和Chatgpt(稍后再详细介绍)。让我们介入SQL Repp,并针对上一个博客中生成的培训师数据运行基本查询:
InfluxDB 3.0 CLI.
(>) sql
(sql >) SELECT * FROM caught
现在,我通常不建议您不用某种形式的基于时间的子句进行查询,但是我想突出显示CLI如何处理大型数据集。它使用模式=从Python客户端库中的块来将大型数据集分解为可管理的箭头批次。从那里我们有三个选择。
- 我们可以点击** tab **以查看下一个数据,如果存在。
- 按 f 将当前的箭头批次保存到我们选择的文件类型(JSON,CSV,PARQUET,ORC,feather)。
- 按** ctrl-c **返回sql repl。
让我们看一下选项2:
| 3961 | 82 | Venusaur | 83 | 80 | 0003 | 12 | 7 | 80 | 2023-07-06 13:41:36.588000 | ash | Grass | Poison |
| 3962 | 64 | Dratini | 45 | 41 | 0147 | 6 | 7 | 50 | 2023-07-06 14:30:32.519000 | jessie | Dragon | |
Press TAB to fetch next chunk of data, or F to save current chunk to a file
Enter the file name with full path (e.g. /home/user/sample.json): ~/Desktop/all-trainer-data.csv
Data saved to ~/Desktop/all-trainer-data.csv.
这是创建的CSV文件的示例:
"attack","caught","defense","hp","id","level","num","speed","time","trainer","type1","type2"
49,"Bulbasaur",49,45,"0001",12,"1",45,2023-07-06 14:30:41.886000000,"ash","Grass","Poison"
62,"Ivysaur",63,60,"0002",7,"1",60,2023-07-06 14:30:32.519000000,"ash","Grass","Poison"
62,"Ivysaur",63,60,"0002",8,"1",60,2023-07-06 14:30:38.519000000,"ash","Grass","Poison"
到达数据集的末尾后,它会提示我们按输入**,以便回到SQL REPL中。只需记住,如果您觉得自己一直按** tab **,您总是可以用** ctrl-c。
退出查询。现在,让我们看一个更有趣的示例,其中infuxql repl:
(sql >) exit
(>) influxql
(influxql >) SELECT count(caught) FROM caught WHERE time > now() - 2d GROUP BY trainer
| | iox::measurement | time | trainer | count |
|---:|:-------------------|:--------------------|:----------|--------:|
| 0 | caught | 1970-01-01 00:00:00 | ash | 625 |
| 1 | caught | 1970-01-01 00:00:00 | brock | 673 |
| 2 | caught | 1970-01-01 00:00:00 | gary | 645 |
| 3 | caught | 1970-01-01 00:00:00 | james | 664 |
| 4 | caught | 1970-01-01 00:00:00 | jessie | 663 |
| 5 | caught | 1970-01-01 00:00:00 | misty | 693 |
\
(influxql >) SELECT count(caught) FROM caught WHERE time > now() - 2d GROUP BY time(1d),trainer ORDER BY time
| | iox::measurement | time | trainer | count |
|---:|:-------------------|:--------------------|:----------|--------:|
| 0 | caught | 2023-07-05 00:00:00 | ash | nan |
| 1 | caught | 2023-07-06 00:00:00 | ash | 625 |
| 2 | caught | 2023-07-07 00:00:00 | ash | 148 |
| 3 | caught | 2023-07-05 00:00:00 | brock | nan |
| 4 | caught | 2023-07-06 00:00:00 | brock | 673 |
| 5 | caught | 2023-07-07 00:00:00 | brock | 180 |
| 6 | caught | 2023-07-05 00:00:00 | gary | nan |
| 7 | caught | 2023-07-06 00:00:00 | gary | 645 |
| 8 | caught | 2023-07-07 00:00:00 | gary | 155 |
| 9 | caught | 2023-07-05 00:00:00 | james | nan |
| 10 | caught | 2023-07-06 00:00:00 | james | 664 |
| 11 | caught | 2023-07-07 00:00:00 | james | 157 |
| 12 | caught | 2023-07-05 00:00:00 | jessie | nan |
| 13 | caught | 2023-07-06 00:00:00 | jessie | 663 |
| 14 | caught | 2023-07-07 00:00:00 | jessie | 144 |
| 15 | caught | 2023-07-05 00:00:00 | misty | nan |
| 16 | caught | 2023-07-06 00:00:00 | misty | 693 |
| 17 | caught | 2023-07-07 00:00:00 | misty | 178 |
我们将把这个作为稍后的Parquet文件保存。
写
从使用CLI进行查询,让我们谈谈写功能。现在,此功能集并不像我想要的那样充实,但它涵盖了基础知识。我们可以使用类似的行协议进入写入数据并将数据写入InfluxDB:
(influxql >) exit
(>) write
(write >) caught,id=0115,num=1,trainer=brock attack=125i,caught="KangaskhanMega Kangaskhan",defense=100i,hp=105i,level=13i,speed=100i,type1="Normal" 1688741473083000000
接下来让我们查看write_file
功能。为此,我们需要完全退出重录并在调用infux3时使用标志命令。让我们将计数结果加载到一个新表中:
(write >) exit
(>) exit
Exiting …
influx3 write_file --help
usage: influx3 write_file [-h] --file FILE [--measurement MEASUREMENT] --time TIME [--tags TAGS]
options:
-h, --help show this help message and exit
--file FILE the file to import
--measurement MEASUREMENT
Define the name of the measurement
--time TIME Define the name of the time column within the file
--tags TAGS (optional) array of column names which are tags. Format should be: tag1,tag2
influx3 write_file --file ~/Desktop/count.parquet --time time --tags trainer --measurement summary
这是结果:
(influxql >) SELECT count, trainer, time FROM summary
| | iox::measurement | time | count | trainer |
|---:|:-------------------|:--------------------|--------:|:----------|
| 0 | summary | 2023-07-05 00:00:00 | nan | ash |
| 1 | summary | 2023-07-05 00:00:00 | nan | brock |
| 2 | summary | 2023-07-05 00:00:00 | nan | gary |
| 3 | summary | 2023-07-05 00:00:00 | nan | james |
| 4 | summary | 2023-07-05 00:00:00 | nan | jessie |
| 5 | summary | 2023-07-05 00:00:00 | nan | misty |
| 6 | summary | 2023-07-06 00:00:00 | 625 | ash |
| 7 | summary | 2023-07-06 00:00:00 | 673 | brock |
| 8 | summary | 2023-07-06 00:00:00 | 645 | gary |
| 9 | summary | 2023-07-06 00:00:00 | 664 | james |
| 10 | summary | 2023-07-06 00:00:00 | 663 | jessie |
| 11 | summary | 2023-07-06 00:00:00 | 693 | misty |
| 12 | summary | 2023-07-07 00:00:00 | 148 | ash |
| 13 | summary | 2023-07-07 00:00:00 | 180 | brock |
| 14 | summary | 2023-07-07 00:00:00 | 155 | gary |
| 15 | summary | 2023-07-07 00:00:00 | 157 | james |
| 16 | summary | 2023-07-07 00:00:00 | 144 | jessie |
| 17 | summary | 2023-07-07 00:00:00 | 178 | misty |
实验功能(chatgpt)
因此,随着Chatgpt和Openai如今的所有风气,我都希望看看他们的Python套餐是否可以使CLI受益。有趣的是,由于InfuxdB成立以来一直是开源的,因此Chatgpt在构建流入Ql查询方面已经非常精通。看看这个示例:
(chatgpt >) give me a list of the top 10 caught with an attack higher than 100 from caught
Run InfluxQL query: SELECT * FROM caught WHERE attack > 100 LIMIT 10
| | iox::measurement | time | attack | caught | defense | hp | id | level | num | speed | trainer | type1 | type2 |
|---:|:-------------------|:---------------------------|---------:|:--------------------------|----------:|-----:|-----:|--------:|------:|--------:|:----------|:---------|:--------|
| 0 | caught | 2023-07-06 13:09:36.095000 | 110 | Dodrio | 70 | 60 | 0085 | 19 | 1 | 100 | jessie | Normal | Flying |
| 1 | caught | 2023-07-06 13:09:36.095000 | 125 | Pinsir | 100 | 65 | 0127 | 6 | 1 | 85 | brock | Bug | |
| 2 | caught | 2023-07-06 13:10:53.995000 | 130 | CharizardMega Charizard X | 111 | 78 | 0006 | 6 | 1 | 100 | brock | Fire | Dragon |
| 3 | caught | 2023-07-06 13:10:53.995000 | 150 | BeedrillMega Beedrill | 40 | 65 | 0015 | 12 | 1 | 145 | jessie | Bug | Poison |
| 4 | caught | 2023-07-06 13:10:53.995000 | 102 | Nidoking | 77 | 81 | 0034 | 20 | 1 | 85 | gary | Poison | Ground |
| 5 | caught | 2023-07-06 13:10:53.995000 | 105 | Primeape | 60 | 65 | 0057 | 16 | 1 | 95 | misty | Fighting | |
| 6 | caught | 2023-07-06 13:10:53.995000 | 120 | Golem | 130 | 80 | 0076 | 8 | 1 | 45 | ash | Rock | Ground |
| 7 | caught | 2023-07-06 13:10:53.995000 | 105 | Muk | 75 | 105 | 0089 | 5 | 1 | 50 | brock | Poison | |
| 8 | caught | 2023-07-06 13:10:53.995000 | 105 | Muk | 75 | 105 | 0089 | 19 | 1 | 50 | james | Poison | |
| 9 | caught | 2023-07-06 13:10:53.995000 | 105 | Muk | 75 | 105 | 0089 | 16 | 2 | 50 | james | Poison | |
此功能当前仅使用Chatgpt 3.5,需要OpenAPI令牌。如果您想要有关如何使用此功能的说明,请查看README的这一部分。
未来的希望
我们的开发团队通过用于InfuxDB 3.0的工具向前推进,这对Python CLI来说是光明的。目前,范围是将其作为Python开发人员和想要易于扩展的CLI的螺栓操作工具。这是我目前为该项目的洗衣清单:
功能 | 状态 |
提高OpenAI功能:
|
做 |
找到一种更好的包装和分发方法。目前将Pyinstaller视为一种选择。 | 做 |
扩展写功能。 | 做 |
提供查询后探索支持(PANDAS功能) | 做 |
整合三角洲共享 | 做 |
包起来
这样就可以了,第2部分完成并撒了灰尘。我真的很喜欢在Python客户库和CLI上写这个博客系列。在检查中拥有如此沉重的手使关于它们的文章更加令人兴奋和容易。我希望这些博客能够激发您加入我们新的基于社区的图书馆和工具。如果您想谈论如何参与,可以通过Slack或Discourse与我联系。