命令行工具(和python库),用于将commcarehq中的数据提取到sql数据库或excel工作簿中
commcare-export的Python项目详细描述
Commcare出口
https://github.com/dimagi/commcare导出
一个命令行工具(和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。
- 通过PIP安装Commcare Export
$ pip install commcare-export<P>2。访问CommcareHQ Exchange并添加简单的CommCareDemo/Tutorial应用程序 新的项目空间。
- 访问发布管理器,生成一个版本,单击星号发布。
- 访问CloudCare并填写一系列表格。
- 在 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/>内置函数,如 api_data 和基本算法和比较,通过环境提供,使用 ref 引用名称,并通过 应用
内置函数列表:
<表> < COLGROUP > < COL/> < COL/> < COL/> <广告> 函数 说明 示例用法 < /广告> <正文> +, -, *,//,/,>;,<;,>;=,<;= 标准数学输出格式
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
贡献
- 如果您还没有注册github,请访问https://github.com
- 将存储库转移到https://github.com/dimagi/commcare-export" rel="nofollow">https://github.com/dimagi/commcare export
- 克隆您的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
- 进行编辑。
$ pip install commcare-export0
- 向上推功能分支
$ pip install commcare-export1
- 访问https://github.com/dimagi/commcare-export" rel="nofollow">https://github.com/dimagi/commcare export并提交请求。
- 感谢您的贡献:谢谢!
释放过程
- 为版本创建标记
$ pip install commcare-export2
- 创建源分发
$ pip install commcare-export3
确保存档文件( dist/commcare-export-x.yy.0.tar.gz )具有正确的版本号(与标记名匹配)。
- 上传到pypi
$ pip install commcare-export4
- 验证上载
https://pypi.python.org/pypi/commcare导出
- 在github上创建发行版
测试数据库
支持的数据库有postgresql、mysql、mssql