cli: print -O sql

This commit is contained in:
Dmitry Astapov 2020-06-13 21:11:24 +01:00 committed by Simon Michael
parent d2e0312ab1
commit c8a84e3c96
3 changed files with 32 additions and 3 deletions

View File

@ -17,6 +17,7 @@ where
import Data.Maybe (isJust)
import Data.Text (Text)
import Data.List (intercalate)
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import System.Console.CmdArgs.Explicit
@ -37,7 +38,7 @@ printmode = hledgerCommandMode
"show all amounts explicitly"
,flagNone ["new"] (setboolopt "new")
"show only newer-dated transactions added in each file since last run"
,outputFormatFlag ["txt","csv","json"]
,outputFormatFlag ["txt","csv","json","sql"]
,outputFileFlag
])
[generalflagsgroup1]
@ -60,6 +61,7 @@ printEntries opts@CliOpts{reportopts_=ropts} j = do
"txt" -> entriesReportAsText opts
"csv" -> (++"\n") . printCSV . entriesReportAsCsv
"json" -> (++"\n") . TL.unpack . toJsonText
"sql" -> entriesReportAsSql
_ -> const $ error' $ unsupportedOutputFormatError fmt
writeOutput opts $ render $ entriesReport ropts q j
@ -125,6 +127,20 @@ originalPostingPreservingAccount p = (originalPosting p) { paccount = paccount p
-- ]
-- ]
entriesReportAsSql :: EntriesReport -> String
entriesReportAsSql txns =
"create table if not exists postings(id serial,txnidx int,date1 date,date2 date,status text,code text,description text,comment text,account text,amount numeric,commodity text,credit numeric,debit numeric,posting_status text,posting_comment text);\n"++
"insert into postings(txnidx,date1,date2,status,code,description,comment,account,amount,commodity,credit,debit,posting_status,posting_comment) values\n"++
(intercalate "," (map values csv))
++";\n"
where
values vs = "(" ++ (intercalate "," $ map toSql vs) ++ ")\n"
toSql "" = "NULL"
toSql s = "'" ++ (concatMap quoteChar s) ++ "'"
quoteChar '\'' = "''"
quoteChar c = [c]
csv = concatMap transactionToCSV txns
entriesReportAsCsv :: EntriesReport -> CSV
entriesReportAsCsv txns =
["txnidx","date","date2","status","code","description","comment","account","amount","commodity","credit","debit","posting-status","posting-comment"] :

View File

@ -75,7 +75,7 @@ This command also supports the
[output destination](hledger.html#output-destination) and
[output format](hledger.html#output-format) options
The output formats supported are
`txt`, `csv`, and (experimental) `json`.
`txt`, `csv`, and (experimental) `json` and `sql`.
Here's an example of print's CSV output:

View File

@ -774,7 +774,7 @@ $ hledger print -o - # write to stdout (the default)
Some commands (print, register, the balance commands) offer a choice of output format.
In addition to the usual plain text format (`txt`), there are
CSV (`csv`), HTML (`html`) and JSON (`json`).
CSV (`csv`), HTML (`html`), JSON (`json`) and SQL (`sql`).
This is controlled by the `-O/--output-format` option:
```shell
$ hledger print -O csv
@ -819,6 +819,19 @@ Some notes about JSON output:
find otherwise, please let us know.
(Cf [#1195](https://github.com/simonmichael/hledger/issues/1195))
Notes about SQL output:
- SQL output is also marked experimental, and much like JSON could use
real-world feedback.
- SQL output is expected to work with sqlite, MySQL and PostgreSQL
- SQL output is structured with the expectations that statements will
be executed in the empty database. If you already have tables created
via SQL output of hledger, you would probably want to either clear tables
of existing data (via `delete` or `truncate` SQL statements) or drop
tables completely as otherwise your postings will be duped.
## Regular expressions
hledger uses [regular expressions](http://www.regular-expressions.info) in a number of places: