cli: print -O sql
This commit is contained in:
parent
d2e0312ab1
commit
c8a84e3c96
@ -17,6 +17,7 @@ where
|
|||||||
|
|
||||||
import Data.Maybe (isJust)
|
import Data.Maybe (isJust)
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
|
import Data.List (intercalate)
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.Lazy as TL
|
import qualified Data.Text.Lazy as TL
|
||||||
import System.Console.CmdArgs.Explicit
|
import System.Console.CmdArgs.Explicit
|
||||||
@ -37,7 +38,7 @@ printmode = hledgerCommandMode
|
|||||||
"show all amounts explicitly"
|
"show all amounts explicitly"
|
||||||
,flagNone ["new"] (setboolopt "new")
|
,flagNone ["new"] (setboolopt "new")
|
||||||
"show only newer-dated transactions added in each file since last run"
|
"show only newer-dated transactions added in each file since last run"
|
||||||
,outputFormatFlag ["txt","csv","json"]
|
,outputFormatFlag ["txt","csv","json","sql"]
|
||||||
,outputFileFlag
|
,outputFileFlag
|
||||||
])
|
])
|
||||||
[generalflagsgroup1]
|
[generalflagsgroup1]
|
||||||
@ -60,6 +61,7 @@ printEntries opts@CliOpts{reportopts_=ropts} j = do
|
|||||||
"txt" -> entriesReportAsText opts
|
"txt" -> entriesReportAsText opts
|
||||||
"csv" -> (++"\n") . printCSV . entriesReportAsCsv
|
"csv" -> (++"\n") . printCSV . entriesReportAsCsv
|
||||||
"json" -> (++"\n") . TL.unpack . toJsonText
|
"json" -> (++"\n") . TL.unpack . toJsonText
|
||||||
|
"sql" -> entriesReportAsSql
|
||||||
_ -> const $ error' $ unsupportedOutputFormatError fmt
|
_ -> const $ error' $ unsupportedOutputFormatError fmt
|
||||||
writeOutput opts $ render $ entriesReport ropts q j
|
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 :: EntriesReport -> CSV
|
||||||
entriesReportAsCsv txns =
|
entriesReportAsCsv txns =
|
||||||
["txnidx","date","date2","status","code","description","comment","account","amount","commodity","credit","debit","posting-status","posting-comment"] :
|
["txnidx","date","date2","status","code","description","comment","account","amount","commodity","credit","debit","posting-status","posting-comment"] :
|
||||||
|
|||||||
@ -75,7 +75,7 @@ This command also supports the
|
|||||||
[output destination](hledger.html#output-destination) and
|
[output destination](hledger.html#output-destination) and
|
||||||
[output format](hledger.html#output-format) options
|
[output format](hledger.html#output-format) options
|
||||||
The output formats supported are
|
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:
|
Here's an example of print's CSV output:
|
||||||
|
|
||||||
|
|||||||
@ -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.
|
Some commands (print, register, the balance commands) offer a choice of output format.
|
||||||
In addition to the usual plain text format (`txt`), there are
|
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:
|
This is controlled by the `-O/--output-format` option:
|
||||||
```shell
|
```shell
|
||||||
$ hledger print -O csv
|
$ hledger print -O csv
|
||||||
@ -819,6 +819,19 @@ Some notes about JSON output:
|
|||||||
find otherwise, please let us know.
|
find otherwise, please let us know.
|
||||||
(Cf [#1195](https://github.com/simonmichael/hledger/issues/1195))
|
(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
|
## Regular expressions
|
||||||
|
|
||||||
hledger uses [regular expressions](http://www.regular-expressions.info) in a number of places:
|
hledger uses [regular expressions](http://www.regular-expressions.info) in a number of places:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user