diff --git a/hledger/Hledger/Cli/Commands/Print.hs b/hledger/Hledger/Cli/Commands/Print.hs index b71246db8..4317192f2 100644 --- a/hledger/Hledger/Cli/Commands/Print.hs +++ b/hledger/Hledger/Cli/Commands/Print.hs @@ -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"] : diff --git a/hledger/Hledger/Cli/Commands/Print.md b/hledger/Hledger/Cli/Commands/Print.md index 64d063814..beda530ce 100644 --- a/hledger/Hledger/Cli/Commands/Print.md +++ b/hledger/Hledger/Cli/Commands/Print.md @@ -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: diff --git a/hledger/hledger.m4.md b/hledger/hledger.m4.md index 48761beeb..567bbe9f4 100644 --- a/hledger/hledger.m4.md +++ b/hledger/hledger.m4.md @@ -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: