MathematicaSQL導出示例

SQL導出示例模板


Background


按照我的工作經驗,涉及到數據和環境的問題,其中會有一些導數據的事情。

記得上一家公司使用阿里御膳房時,數據導出通常有兩種,一種是按介面同步到我們自己的資料庫,然後再導出。

當時還用curl+limit控制拉過一些數據,簡單理解為網頁里只能顯示部分數據。

當前公司有四種環境,線上數據導出網頁版工具也只是顯示部分,我也用Mathematica寫過合併多個查詢的腳本。

其次就是本例中的連資料庫查詢的導出,因為數據記錄數多,查詢導出太多有性能壓力,每次只能導出部分再暫停幾秒鐘等。

個人只是借許多工作任務的機會,玩一玩Mma,有的時候快,有的時候慢。

Template字元串模板的使用,我在Python里也用template,只不過這個是後面版本更新的新函數,許多人老人可能並不會去使用,有的時候你覺得Mma里好多新奇函數,其他其他語言也都有,只不過你先從Mma看到了,還是先從書里看到還是先從其他語言看到的問題。

Mma合併多個網頁數據,解析這種,相關內容比如StringCases玩熟悉了,比用其他語言解析要快,以前參與一個java爬蟲的時候也用jsoup解析什麼的,但是許多臨時性的數據工作,用那些語言來講就是太慢了。

Connecting Database


Needs["DatabaseLink`"];nnnconn = OpenSQLConnection[JDBC["Microsoft SQL Server(jTDS)", "Release-Readonly.db.company.com"], "Username" -> "******", "Password" -> "******"]n n

Template


sqlTemplate[Query] = StringTemplate@"select t1.icid3,t1.ipbid,t1.iJoinId,t1.iStatus,t1.icidM,t1.ipscid,t1.icid3,t1.ipbid,t2.bFlag,t2.dAddTime,t2.dTimefrom Release.dbo.info as t1left JOINRelease.dbo.table as t2 on t1.iJoinId=t2.iJoinIdwhere t2.dAddTime > `date1` and t2.dAddTime < `date2`";nnnsqlTemplate[Count] = StringTemplate@"select count(*) from Release.dbo.info as t1left JOINRelease.dbo.table as t2 on t1.iJoinId=t2.iJoinIdwhere t2.dAddTime > `date1` and t2.dAddTime < `date2`";n

Run


dateString := DateString[#, {"Year", "-", "Month", "-", "Day", " ", "Hour", ":", "Minute", ":", "Second"}] &nnMonitor[ Do[today = DateString[DatePlus["2014-12-01", i - 1], {"Year", "-", "Month", "-", "Day"}];ntomorrow = DateString[DatePlus["2014-12-01", i], {"Year", "-", "Month", "-", "Day"}];nsql[Query] = TemplateApply[sqlTemplate[Query], Association["date1" -> today, "date2" -> tomorrow]];nsql[Count] = TemplateApply[sqlTemplate[Count], Association["date1" -> today, "date2" -> tomorrow]];ncount = SQLExecute[conn, sql[Query]][[1, 1]];nres = SQLExecute[conn, sql[Query]];nresToExport = Map[ToString, MapAt[dateString @@ # &, res, {All, {-2, -1}}], {2}];nPause[1];npauseTime = IntegerPart[count/10000];nExport["D:/" <> "sqlData@" <> today <> ".csv", resToExport, "TextDelimiters" -> """];nPrintTemporary[count, "@PausingTime@60*", (pauseTime)];nPause[(30*pauseTime) + 10];n, {i, 1, 1}], {i}]n


ExportString[names = {"icid3", "ipbid", "iJoinId", "iStatus", "icidM", "ipscid", "icid3", "ipbid", "bFlag", "dAddTime", "dTime"}, "JSON"] // StringReplace[#, {""" -> ""}] &n

[

icid3,

ipbid,

iJoinId,

iStatus,

icidM,

ipscid,

icid3,

ipbid,

bFlag,

dAddTime,

dTime

]

<< "/Users/hypergroups/Documents/Wolfram Mathematica/DeployProjects/MyMarkDown.m"nnNotebook2Markdown[EvaluationNotebook[], "title" -> "sample_sql", "dirOutput" -> "/Users/hypergroups/Documents/MyMarkdown/知乎專欄/"]n

推薦閱讀:

以 MySQL 為例,如何進行 SQL 注入和防止被注入?
零基礎如何學習SQL——了解select查詢語句
從編程語言設計的角度,如何評價SQL語言?
為什麼用SQL而不是Excel+VBA?

TAG:WolframMathematica | 数据科学 | SQL |