客户端库深度剖析:Python(第二部分)
作者:Jay Clifford / 产品,开发者
2023年7月28日
导航到
使用新的InfluxDB 3.0 Python CLI和客户端库进行工作
好吧,我们回来了,第二部分!上次我们讨论了InfluxDB 3.0的新社区Python库。如果您错过了,也可以观看视频形式的内容。
现在,第二部分,让我们来谈谈一个使用客户端库作为其开发核心的附加应用程序,即InfluxDB 3.0 Python CLI。
Python CLI
好的,按照之前的格式,我们为什么构建CLI呢?嗯,有两个主要的原因
-
我们想给用户提供一个数据浏览工具,利用新的Flight端点。Python给了我们快速原型化的机会,在我们投入更多工作构建更强大的CLI提供之前。它还允许我们利用一些有趣的数据操作库,可以扩展Python CLI的范围。
-
我们想有一个健壮的方式来测试新创建的InfluxDB 3.0 Python客户端库,正如您将看到的,大多数工具和功能都在使用。
安装
让我们谈谈安装过程,因为我必须承认,除非你每天使用Python,否则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一样,将您的连接凭证保存下来,以便以后使用InfluxDB。
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>"
–name | 描述您的连接配置的名称。这必须是唯一的。 |
–token | 这为客户端提供了从InfluxDB Cloud 无服务器或专用读取和写入的认证。注意:如果您想使用这两个功能,您需要一个具有读取和写入认证的令牌。 |
–host | InfluxDB主机——这应该是域,不包括协议(https://) |
–org | 云无服务器仍然需要用户的组织ID来写入数据到3.0版本。专用的用户可以使用任意字符串。 |
–database | 您希望从中查询和写入数据的数据库。 |
配置命令
也存在配置命令来激活、更新、删除和列出当前激活的配置。
|
更新子命令更新现有的配置。必须使用--name参数指定要更新的配置。所有其他参数(--host, --token, --database, --org, --active)都是可选的。 |
|
使用子命令将特定的配置设置为活动配置。必须使用--name参数指定要使用的配置。 |
|
删除子命令删除配置。必须使用--name参数指定要删除的配置。 |
|
列出子命令列出所有配置。 |
写入和查询
您可以使用CLI直接调用应用程序,然后运行您希望运行的命令,或者通过交互式REPL来运行它。我个人认为REPL方法提供了更好的流程,所以让我们演示一些功能。
一旦您创建了配置,只需输入以下命令即可激活REPL
influx3
这将导致
influx3
InfluxDB 3.0 CLI.
(>)
查询
让我们首先看看查询选项。在REPL中,您有3个查询选项:SQL、InfluxQL和chatGPT(稍后详细介绍)。让我们进入SQL REPL并运行一个基本的查询,针对我们在上篇文章中生成的Trainer数据。
InfluxDB 3.0 CLI.
(>) sql
(sql >) SELECT * FROM caught
通常,我不会推荐在没有基于时间WHERE子句的情况下进行查询,但我想强调CLI如何处理大量数据集。它使用Python客户端库中的mode = chunk
将大型数据集拆分为可管理的Arrow批次。从那里我们有三个选项。
-
如果存在下一个数据部分,我们可以按
键查看。 -
按
键将当前Arrow批次保存为我们选择的文件类型(JSON、CSV、Parquet、ORC、Feather)。 -
按
键返回到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"
一旦我们到达数据集的末尾,它会提示我们按
现在,让我们看看InfluxQL 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进行查询转移到写入功能。现在,这个功能集不像我希望的那么完善,但它覆盖了基础。我们可以进入写入REPL并使用行协议将数据写入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
功能。为此,我们需要完全退出REPL并使用标志命令调用‘influx3’。让我们将计数结果加载到一个新表中
(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带来好处。有趣的是,它确实可以……因为InfluxDB自成立以来就是开源的,chatGPT已经非常擅长构建InfluxQL查询。看看这个例子
(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中的这部分。
未来展望
Python CLI的未来前景广阔,因为我们的开发团队正在推进InfluxDB 3.0的工具开发。目前的目标是将其保持为一个用于Python开发者和希望拥有易于扩展的CLI的附加工具。以下是我在项目中的当前待办事项清单
功能 | 状态 |
---|---|
改进OpenAI功能
|
待办事项 |
寻找更好的打包和分发方式。目前正在考虑Pyinstaller作为选项。 | 待办事项 |
扩展写入功能。 | 待办事项 |
提供查询后探索支持(Pandas函数) | 待办事项 |
集成delta共享 | 待办事项 |
总结
这就是第二部分的内容,已经完成并尘埃落定。我非常享受撰写关于Python客户端库和CLI的博客系列。对它们的深入检查使得撰写关于它们变得远更令人兴奋和容易。我希望这些博客能激励您加入我们的基于社区的新库和工具。如果您想讨论如何参与其中,可以通过Slack或Discourse联系我。