命令行工具(和python库),用于将commcarehq中的数据提取到sql数据库或excel工作簿中

commcare-export的Python项目详细描述


Commcare出口

https://github.com/dimagi/commcare导出

构建状态test coveragepypi version /P>

一个命令行工具(和python库),用于从commcarehq的rest生成自定义导出 API ./p>

安装和快速启动

0a.安装python并 pip 。这个工具是用python 2.7和3.3进行测试的。

0b.如果您还没有注册,请登录http://www.commcarehq.org/register/user" rel="nofollow">https://www.commcarehq.org/register/user。

  1. 通过PIP安装Commcare Export
$ pip install commcare-export
<P>2。访问CommcareHQ Exchange并添加简单的CommCareDemo/Tutorial应用程序 新的项目空间。

  1. 访问发布管理器,生成一个版本,单击星号发布。
  2. 访问CloudCare并填写一系列表格。
  3. examples/ 目录中尝试示例查询,在命令行中提供项目名称:
$ commcare-export \
     --query examples/demo-registration.xlsx \
     --project YOUR_PROJECT \
     --output-format markdown

$ commcare-export \
     --query examples/demo-registration.json \
     --project YOUR_PROJECT \
     --output-format markdown

$ commcare-export \
     --query examples/demo-deliveries.xlsx \
     --project YOUR_PROJECT \
     --output-format markdown

$ commcare-export \
     --query examples/demo-deliveries.json \
     --project YOUR_PROJECT \
     --output-format markdown

你会看到表格打印出来的。更改为 --输出格式 sql --输出 url-to-u-your-db --自 日期 起同步自该日期起提交的所有表单。

所有示例都以excel和等效的json格式提供。

命令行用法

命令行工具的基本用法是与保存的excel或json查询一起使用(请参见下面的如何编写这些查询)

$ commcare-export --commcare-hq <URL or alias like "local" or "prod"> \
                  --username <username> \
                  --project <project> \
                  --version <api version, defaults to latest known> \
                  --query <excel file, json file, or raw json> \
                  --output-format <csv, xls, xlsx, json, markdown, sql> \
                  --output <file name or SQL database URL>

有关选项的完整列表,请参见"Commcare导出"。

examples/ 目录中有commcare演示应用程序的示例查询文件(可在commcarehq exchange上获得)。

--输出

commcare export使用sqlalachemy的 创建引擎 来建立数据库连接。这是基于 关闭RFC-1738协议。一些常见示例:

# Postgres
postgresql+psycopg2://scott:tiger@localhost/mydatabase

# MySQL
mysql+pymysql://scott:tiger@localhost/mydatabase

# MSSQL
mssql+pyodbc://scott:tiger@localhost/mydatabases?driver=ODBC+Driver+17+for+SQL+Server

Excel查询

excel查询是任何 .xlsx 工作簿。工作簿中的每个工作表代表一个要创建的表。有两组列来配置 表:< >

  • 数据源 :将其设置为 表单 以导出表单数据,或案例数据。
  • 筛选器名称 / 筛选器值 :这些列是成对的,用于筛选输入案例或表单。
  • 字段 :值在SQL数据库中的目标。
  • 源字段 :要从表单中提取的特定字段。这可以是任何json路径。

json查询

下表描述了json查询。您将构建一个json对象来表示您想要的查询。开始工作的一个好方法是 或者,您可以创建一个excel查询,并使用 --dump query运行该工具,以查看生成的json查询。

python库用法

作为一个库,各种"Commcare"导出模块使您可以轻松地

  • 与CommCareHQ Rest API交互
  • 对api执行"miniliq"查询(一种非常简单的查询语言,如下所述)
  • 加载和保存minilinq查询的json表示形式
  • 将excel配置编译为minilinq查询

要直接访问CommCareHQ Rest API:

>>>importgetpass>>>fromcommcare_export.commcare_hq_clientimportCommCareHqClient>>>api_client=CommCareHqClient('http://commcarehq.org',project='your_project').authenticated('your_username',getpass.getpass())>>>forms=api_client.iterate('form',{'app_id':"whatever"})>>>[(form['received_on'],form['form.gender'])forforminforms]

对它发出一个 minilinq 查询,然后在json序列化中打印出该查询:

importgetpassimportjsonfromcommcare_export.minilinqimport*fromcommcare_export.commcare_hq_clientimportCommCareHqClientfromcommcare_export.commcare_minilinqimportCommCareHqEnvfromcommcare_export.envimportBuiltInEnvapi_client=CommCareHqClient(url="http://www.commcarehq.org",project='your_project',version='0.5')api_client=api_client.authenticated(username='username',password='password',mode='digest')source=Map(source=Apply(Reference("api_data"),Literal("form"),Literal({"filter":{"term":{"app_id":"whatever"}}})),body=List([Reference("received_on"),Reference("form.gender"),]))query=Emit('demo-table',[Literal('Received On'),Literal('Gender')],source)printjson.dumps(query.to_jvalue(),indent=2)results=query.eval(BuiltInEnv()|CommCareHqEnv(api_client)|JsonPathEnv())iflen(list(env.emitted_tables()))>0:# with writers.Excel2007TableWriter("excel-output.xlsx") as writer:withwriters.StreamingMarkdownTableWriter(sys.stdout)aswriter:fortableinenv.emitted_tables():writer.write_table(table)

它将输出与此等价的json:

{"Emit":{"headings":[{"Lit":"Received On"},{"Lit":"Gender"}],"source":{"Map":{"body":{"List":[{"Ref":"received_on"},{"Ref":"form.gender"}]},"name":None,"source":{"Apply":{"args":[{"Lit":"form"},{"Lit":{"filter":{"term":{"app_id":"whatever"}}}}],"fn":{"Ref":"api_data"}}}}},"table":"demo-table"}}

minilinq参考

抽象语法可以在commcare_export.minilinq 模块中直接检查。注意,函数和原语之间的选择是故意的 选择公开minilinq的结构以进行可能的优化,并限制整个语言。

下面是对astract语法和语义的描述

<表> < COLGROUP > < COL/> < COL/> < COL/> <广告> 蟒蛇 json 计算结果为 < /广告> <正文> 文字(v) {"亮":v} 只是 v 参考(x) {"ref":x} 无论 x 在 环境 列表([a, b,c, …]) {"list":[a,b,c, …} 什么的列表, a b c 评估为 地图(来源、名称、正文) {"map":{"source": …, "name": …, "body": …} 评估每个元素的 来源 。如果名称是 如果,elem将被绑定到 否则它将取代 整个环境 平面图(源、名称、主体) {"平面图":{"源"…等} 映射后展平,如嵌套 列表理解 过滤器(源、名称、主体) ET/< TD/> 绑定(值、名称、正文) ET/< TD/> 将 值的结果绑定到 名称 当评估 正文 发出(表、标题、行) ET/< TD/> 发出带有标题的表格 以及 。注意 是字符串, 标题 是列表 ,并且 是 表达式列表。见 关于发射的解释如下 输出: 应用(fn,args) ET/< TD/> 对函数求值 所有 参数,然后应用 作用于args。 < > <表>

内置函数,如 api_data 和基本算法和比较,通过环境提供,使用 ref 引用名称,并通过 应用

内置函数列表:

<表> < COLGROUP > < COL/> < COL/> < COL/> <广告> 函数 说明 示例用法 < /广告> <正文> +, -, *,//,/,>;,<;,>;=,<;= 标准数学 > 长度 长度 > 布尔 布尔 > str2bool 将字符串转换为布尔值。真值为"true"、"t"、"1"(不区分大小写) > str2日期 将字符串转换为日期 > bool2int 将布尔值转换为整数(0,1) > str2num 将字符串解析为数字 > 选择时间 返回字符串中的第n个单词。n为零索引。 在(3)处选择-返回第4个单词 已选择 如果给定的单词在值中,则返回true。 选定(发烧) 选定计数 计算字数 > 模板 呈现字符串模板(不健壮) 模板({}在{},状态,日期) 附件URL 将附件名称转换为其下载URL > < > <表>

输出格式

minilinq可以使用 emit 表达式定义多个表,其中除了正文行之外还有标题,或者可以简单地返回 单一查询。

如果minilinq不包含任何 emit 表达式,则表达式的结果将作为漂亮的打印json打印到标准输出。

如果您的minilinq 不包含 em it 表达式,则有许多可用的格式,可通过 --输出格式选项进行选择,并且可以 指向带有命令行选项的文件。

  • csv :每个表都是zip存档中的csv文件。
  • xls :每个表格都是旧格式excel电子表格中的一张表格。
  • xlsx :每个表格都是一张新格式的excel电子表格。
  • json :每个表都是json字典的一个成员,打印成标准输出
  • 降价 :表格将以降价格式流式传输到标准输出(非常方便调试查询)
  • sql :所有数据都将被等幂"upsert"到您指定的sql数据库中,包括创建所需的表和列。

依赖关系

所需的依赖项将通过pip自动安装。但是,由于您可能不关心所有导出格式,因此这里的各种依赖项是可选的。 以下是安装它们的方法:

# To export "xlsx"
$ pip install openpyxl

# To export "xls"
$ pip install xlwt

# To sync with a SQL database
$ pip install SQLAlchemy alembic psycopg2 pymysql pyodbc

贡献

  1. 如果您还没有注册github,请访问https://github.com
  2. 将存储库转移到https://github.com/dimagi/commcare-export" rel="nofollow">https://github.com/dimagi/commcare export
  3. 克隆您的fork,安装到virtualenv中,并启动一个功能分支
$ mkvirtualenv commcare-export
$ git clone git@github.com:dimagi/commcare-export.git
$ cd commcare-export
$ pip install -e .
$ git checkout -b my-super-duper-feature
  1. 进行编辑。
<P>4。确保测试通过。对所有版本进行测试的最佳方法是注册https://travis-ci.org" rel="nofollow">https://travis ci.org并为您的 叉子. < /P>
$ pip install commcare-export
0
  1. 向上推功能分支
$ pip install commcare-export
1
  1. 访问https://github.com/dimagi/commcare-export" rel="nofollow">https://github.com/dimagi/commcare export并提交请求。
  2. 感谢您的贡献:谢谢!

释放过程

  1. 为版本创建标记
$ pip install commcare-export
2
  1. 创建源分发
$ pip install commcare-export
3

确保存档文件( dist/commcare-export-x.yy.0.tar.gz )具有正确的版本号(与标记名匹配)。

  1. 上传到pypi
$ pip install commcare-export
4
  1. 验证上载

https://pypi.python.org/pypi/commcare导出

  1. 在github上创建发行版

https://github.com/dimagi/commcare export/releases

测试数据库

支持的数据库有postgresql、mysql、mssql

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
面向java语句的方法与面向表达式的方法   密码学如何在java中为json对象签名?   是否可以通过java程序知道给定卡夫卡消费群体的消费偏移量?   打印字符时出现java未知问号   java为JFrame设置背景色   在ubuntu中检查java版本时linux权限被拒绝   如何用java创建xml模式   java无法在远程服务器上运行Vaadin应用程序   java智能垃圾收集?   java如何在SpringMVC中设置缓存头?   在unix计算机上运行java应用程序a:>签名以输入内容   Java、Apache Commons配置XML属性   使用ArrayList调用Java未经检查的方法   在文本文件中查找并替换单词(Java GUI)   java Android Studio无法检测到JDK7或更新版本   java从socket的有效负载获取事件消息   安卓中java调用子类方法   java如何通过点击超链接来运行jar文件(Firefox)