blob: 455bb7d099154824737cc8a533b800550ec9c59b [file] [log] [blame]
(window.webpackJsonp=window.webpackJsonp||[]).push([[381],{950:function(s,t,a){"use strict";a.r(t);var n=a(70),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"python-原生接口"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#python-原生接口"}},[s._v("#")]),s._v(" Python 原生接口")]),s._v(" "),a("h3",{attrs:{id:"依赖"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#依赖"}},[s._v("#")]),s._v(" 依赖")]),s._v(" "),a("p",[s._v("在使用Python原生接口包前,您需要安装 thrift (>=0.13) 依赖。")]),s._v(" "),a("h3",{attrs:{id:"如何使用-示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#如何使用-示例"}},[s._v("#")]),s._v(" 如何使用 (示例)")]),s._v(" "),a("p",[s._v("首先下载包:"),a("code",[s._v("pip3 install apache-iotdb")])]),s._v(" "),a("p",[s._v("您可以从这里得到一个使用该包进行数据读写的例子:"),a("a",{attrs:{href:"https://github.com/apache/iotdb/blob/master/client-py/SessionExample.py",target:"_blank",rel:"noopener noreferrer"}},[s._v("Example"),a("OutboundLink")],1)]),s._v(" "),a("p",[s._v("(您需要在文件的头部添加"),a("code",[s._v("import iotdb")]),s._v(")")]),s._v(" "),a("p",[s._v("或者:")]),s._v(" "),a("div",{staticClass:"language-python line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" iotdb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Session "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" Session\n\nip "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v("\nport_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6667"')]),s._v("\nusername_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'root'")]),s._v("\npassword_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'root'")]),s._v("\nsession "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" Session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" port_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" username_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" password_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nsession"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("open")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("False")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nzone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("get_time_zone"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nsession"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("close"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("h3",{attrs:{id:"iotdb-testcontainer"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#iotdb-testcontainer"}},[s._v("#")]),s._v(" IoTDB Testcontainer")]),s._v(" "),a("p",[s._v("Python客户端对测试的支持是基于"),a("code",[s._v("testcontainers")]),s._v("库 (https://testcontainers-python.readthedocs.io/en/latest/index.html)的,如果您想使用该特性,就需要将其安装到您的项目中。")]),s._v(" "),a("p",[s._v("要在Docker容器中启动(和停止)一个IoTDB数据库,只需这样做:")]),s._v(" "),a("div",{staticClass:"language-python line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("MyTestCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("unittest"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("TestCase"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("def")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("test_something")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("self"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("with")]),s._v(" IoTDBContainer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("as")]),s._v(" c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n session "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" Session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'localhost'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("get_exposed_port"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6667")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'root'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'root'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("open")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("False")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n result "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("execute_query_statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SHOW TIMESERIES"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("print")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("close"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br")])]),a("p",[s._v("默认情况下,它会拉取最新的IoTDB镜像 "),a("code",[s._v("apache/iotdb:latest")]),s._v("进行测试,如果您想指定待测IoTDB的版本,您只需要将版本信息像这样声明:"),a("code",[s._v('IoTDBContainer("apache/iotdb:0.12.0")')]),s._v(",此时,您就会得到一个"),a("code",[s._v("0.12.0")]),s._v("版本的IoTDB实例。")]),s._v(" "),a("h3",{attrs:{id:"对-pandas-的支持"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#对-pandas-的支持"}},[s._v("#")]),s._v(" 对 Pandas 的支持")]),s._v(" "),a("p",[s._v("我们支持将查询结果轻松地转换为"),a("a",{attrs:{href:"https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("Pandas Dataframe"),a("OutboundLink")],1),s._v("。")]),s._v(" "),a("p",[s._v("SessionDataSet有一个方法"),a("code",[s._v(".todf()")]),s._v(",它的作用是消费SessionDataSet中的数据,并将数据转换为pandas dataframe。")]),s._v(" "),a("p",[s._v("例子:")]),s._v(" "),a("div",{staticClass:"language-python line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" iotdb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Session "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" Session\n\nip "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v("\nport_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6667"')]),s._v("\nusername_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'root'")]),s._v("\npassword_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'root'")]),s._v("\nsession "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" Session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" port_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" username_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" password_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nsession"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("open")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("False")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nresult "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("execute_query_statement"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"SELECT * FROM root.*"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Transform to Pandas Dataset")]),s._v("\ndf "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("todf"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\nsession"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("close"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Now you can work with the dataframe")]),s._v("\ndf "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br")])]),a("h3",{attrs:{id:"给开发人员"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#给开发人员"}},[s._v("#")]),s._v(" 给开发人员")]),s._v(" "),a("h4",{attrs:{id:"介绍"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#介绍"}},[s._v("#")]),s._v(" 介绍")]),s._v(" "),a("p",[s._v("这是一个使用thrift rpc接口连接到IoTDB的示例。在Windows和Linux上操作几乎是一样的,但要注意路径分隔符等不同之处。")]),s._v(" "),a("h4",{attrs:{id:"依赖-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#依赖-2"}},[s._v("#")]),s._v(" 依赖")]),s._v(" "),a("p",[s._v("首选Python3.7或更高版本。")]),s._v(" "),a("p",[s._v("必须安装thrift(0.11.0或更高版本)才能将thrift文件编译为Python代码。下面是官方的安装教程,最终,您应该得到一个thrift可执行文件。")]),s._v(" "),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("http://thrift.apache.org/docs/install/\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("在开始之前,您还需要在Python环境中安装"),a("code",[s._v("requirements_dev.txt")]),s._v("中的其他依赖:")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("pip "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -r requirements_dev.txt\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h4",{attrs:{id:"编译thrift库并调试"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#编译thrift库并调试"}},[s._v("#")]),s._v(" 编译thrift库并调试")]),s._v(" "),a("p",[s._v("在IoTDB源代码文件夹的根目录下,运行"),a("code",[s._v("mvn clean generate-sources -pl client-py -am")]),s._v(",")]),s._v(" "),a("p",[s._v("这个指令将自动删除"),a("code",[s._v("iotdb/thrift")]),s._v("中的文件,并使用新生成的thrift文件重新填充该文件夹。")]),s._v(" "),a("p",[s._v("这个文件夹在git中会被忽略,并且"),a("strong",[s._v("永远不应该被推到git中!")])]),s._v(" "),a("p",[a("strong",[s._v("注意")]),s._v("不要将"),a("code",[s._v("iotdb/thrift")]),s._v("上传到git仓库中 !")]),s._v(" "),a("h4",{attrs:{id:"session-客户端-使用示例"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#session-客户端-使用示例"}},[s._v("#")]),s._v(" Session 客户端 & 使用示例")]),s._v(" "),a("p",[s._v("我们将thrift接口打包到"),a("code",[s._v("client-py/src/iotdb/session.py")]),s._v("中(与Java版本类似),还提供了一个示例文件"),a("code",[s._v("client-py/src/SessionExample.py")]),s._v("来说明如何使用Session模块。请仔细阅读。")]),s._v(" "),a("p",[s._v("另一个简单的例子:")]),s._v(" "),a("div",{staticClass:"language-python line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" iotdb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("Session "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" Session\n\nip "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"127.0.0.1"')]),s._v("\nport_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6667"')]),s._v("\nusername_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'root'")]),s._v("\npassword_ "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'root'")]),s._v("\nsession "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" Session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("ip"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" port_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" username_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" password_"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nsession"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token builtin"}},[s._v("open")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token boolean"}},[s._v("False")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nzone "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" session"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("get_time_zone"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nsession"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("close"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br")])]),a("h4",{attrs:{id:"测试"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试"}},[s._v("#")]),s._v(" 测试")]),s._v(" "),a("p",[s._v("请在"),a("code",[s._v("tests")]),s._v("文件夹中添加自定义测试。")]),s._v(" "),a("p",[s._v("要运行所有的测试,只需在根目录中运行"),a("code",[s._v("pytest .")]),s._v("即可。")]),s._v(" "),a("p",[a("strong",[s._v("注意")]),s._v("一些测试需要在您的系统上使用docker,因为测试的IoTDB实例是使用"),a("a",{attrs:{href:"https://testcontainers-python.readthedocs.io/en/latest/index.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("testcontainers"),a("OutboundLink")],1),s._v("在docker容器中启动的。")]),s._v(" "),a("h4",{attrs:{id:"其他工具"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#其他工具"}},[s._v("#")]),s._v(" 其他工具")]),s._v(" "),a("p",[a("a",{attrs:{href:"https://pypi.org/project/black/",target:"_blank",rel:"noopener noreferrer"}},[s._v("black"),a("OutboundLink")],1),s._v(" 和 "),a("a",{attrs:{href:"https://pypi.org/project/flake8/",target:"_blank",rel:"noopener noreferrer"}},[s._v("flake8"),a("OutboundLink")],1),s._v(" 分别用于自动格式化和 linting。\n它们可以通过 "),a("code",[s._v("black .")]),s._v(" 或 "),a("code",[s._v("flake8 .")]),s._v(" 分别运行。")]),s._v(" "),a("h3",{attrs:{id:"发版"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#发版"}},[s._v("#")]),s._v(" 发版")]),s._v(" "),a("p",[s._v("要进行发版,")]),s._v(" "),a("p",[s._v("只需确保您生成了正确的thrift代码,")]),s._v(" "),a("p",[s._v("运行了linting并进行了自动格式化,")]),s._v(" "),a("p",[s._v("然后,确保所有测试都正常通过(通过"),a("code",[s._v("pytest .")]),s._v("),")]),s._v(" "),a("p",[s._v("最后,您就可以将包发布到pypi了。")]),s._v(" "),a("h4",{attrs:{id:"准备您的环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#准备您的环境"}},[s._v("#")]),s._v(" 准备您的环境")]),s._v(" "),a("p",[s._v("首先,通过"),a("code",[s._v("pip install -r requirements_dev.txt")]),s._v("安装所有必要的开发依赖。")]),s._v(" "),a("h4",{attrs:{id:"发版-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#发版-2"}},[s._v("#")]),s._v(" 发版")]),s._v(" "),a("p",[s._v("有一个脚本"),a("code",[s._v("release.sh")]),s._v("可以用来执行发版的所有步骤。")]),s._v(" "),a("p",[s._v("这些步骤包括:")]),s._v(" "),a("ul",[a("li",[a("p",[s._v("删除所有临时目录(如果存在)")])]),s._v(" "),a("li",[a("p",[s._v("(重新)通过mvn生成所有必须的源代码")])]),s._v(" "),a("li",[a("p",[s._v("运行 linting (flke8)")])]),s._v(" "),a("li",[a("p",[s._v("通过 pytest 运行测试")])]),s._v(" "),a("li",[a("p",[s._v("Build")])]),s._v(" "),a("li",[a("p",[s._v("发布到 pypi")])])])])}),[],!1,null,null,null);t.default=e.exports}}]);