客户端库深度剖析:Python(第二部分)

导航到

InfluxDB-3-Python

使用新的InfluxDB 3.0 Python CLI和客户端库进行工作

好吧,我们回来了,第二部分!上次我们讨论了InfluxDB 3.0的新社区Python库。如果您错过了,也可以观看视频形式的内容。


现在,第二部分,让我们来谈谈一个使用客户端库作为其开发核心的附加应用程序,即InfluxDB 3.0 Python CLI

Python CLI

好的,按照之前的格式,我们为什么构建CLI呢?嗯,有两个主要的原因

  1. 我们想给用户提供一个数据浏览工具,利用新的Flight端点。Python给了我们快速原型化的机会,在我们投入更多工作构建更强大的CLI提供之前。它还允许我们利用一些有趣的数据操作库,可以扩展Python CLI的范围。

  2. 我们想有一个健壮的方式来测试新创建的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 您希望从中查询和写入数据的数据库。

配置命令

也存在配置命令来激活、更新、删除和列出当前激活的配置。

influx3.py config update --name="poke-dex" --host="new-host.com"
更新子命令更新现有的配置。必须使用--name参数指定要更新的配置。所有其他参数(--host, --token, --database, --org, --active)都是可选的。
influx3.py config use --name="poke-dex"
使用子命令将特定的配置设置为活动配置。必须使用--name参数指定要使用的配置。
influx3.py config delete --name="poke-dex"
删除子命令删除配置。必须使用--name参数指定要删除的配置。
influx3.py config list
列出子命令列出所有配置。

写入和查询

您可以使用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批次。从那里我们有三个选项。

  1. 如果存在下一个数据部分,我们可以按键查看。

  2. 键将当前Arrow批次保存为我们选择的文件类型(JSON、CSV、Parquet、ORC、Feather)。

  3. 键返回到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。只需记住,如果您感觉一直在按键,您始终可以使用退出查询。

现在,让我们看看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功能
  • 升级到ChatGPT 4
  • 添加调用函数
  • 扩展到SQL
待办事项
寻找更好的打包和分发方式。目前正在考虑Pyinstaller作为选项。 待办事项
扩展写入功能。 待办事项
提供查询后探索支持(Pandas函数) 待办事项
集成delta共享 待办事项

总结

这就是第二部分的内容,已经完成并尘埃落定。我非常享受撰写关于Python客户端库和CLI的博客系列。对它们的深入检查使得撰写关于它们变得远更令人兴奋和容易。我希望这些博客能激励您加入我们的基于社区的新库和工具。如果您想讨论如何参与其中,可以通过SlackDiscourse联系我。