sq/cli/cmd_root.go

129 lines
3.7 KiB
Go
Raw Normal View History

2020-08-06 20:58:47 +03:00
package cli
import (
"log/slog"
2020-08-06 20:58:47 +03:00
"github.com/spf13/cobra"
"github.com/neilotoole/sq/cli/flag"
"github.com/neilotoole/sq/cli/output/format"
_ "github.com/neilotoole/sq/drivers" // Load drivers
2020-08-06 20:58:47 +03:00
)
func newRootCmd() *cobra.Command {
cmd := &cobra.Command{
Use: `sq QUERY`,
Short: "sq",
2023-03-12 06:25:19 +03:00
Long: `sq is a swiss-army knife for wrangling data.
2020-08-06 20:58:47 +03:00
$ sq '@sakila_pg | .actor | where(.actor_id > 2) | .first_name, .last_name | .[0:10]'
Use sq to query Postgres, SQLite, SQLServer, MySQL, CSV, Excel, etc,
and output in text, JSON, CSV, Excel and so on, or write output to a
database table.
2020-08-06 20:58:47 +03:00
You can query using sq's own jq-like syntax, or in native SQL.
Use "sq inspect" to view schema metadata. Use the "sq tbl" commands
to copy, truncate and drop tables. Use "sq diff" to compare source
metadata and row data.
See docs and more: https://sq.io`,
Example: ` # Add Postgres source.
$ sq add postgres://user@localhost/sakila -p
Password: ****
2020-08-06 20:58:47 +03:00
# List available data sources.
$ sq ls
2020-08-06 20:58:47 +03:00
# Set active data source.
$ sq src @sakila_pg
2020-08-06 20:58:47 +03:00
# Get specified cols from table address in active data source.
$ sq '.actor | .actor_id, .first_name, .last_name'
2020-08-06 20:58:47 +03:00
# Ping a data source.
$ sq ping @sakila_pg
# View metadata (schema, stats etc) for data source.
$ sq inspect @sakila_pg
2020-08-06 20:58:47 +03:00
# View metadata for a table.
$ sq inspect @sakila_pg.actor
# Output all rows from 'actor' table in JSON.
$ sq -j .actor
2020-08-06 20:58:47 +03:00
# Output in text format (with header).
$ sq -th .actor
2020-08-06 20:58:47 +03:00
# Output in text format (no header).
$ sq -tH .actor
2020-08-06 20:58:47 +03:00
# Output to a HTML file.
$ sq --html '@sakila_pg.actor' -o actor.html
2020-08-06 20:58:47 +03:00
# Join across data sources.
$ sq '@my1.person, @pg1.address | join(.uid) | .username, .email, .city'
2020-08-06 20:58:47 +03:00
# Insert query results into a table in another data source.
$ sq --insert=@pg1.person '@my1.person | .username, .email'
2020-08-06 20:58:47 +03:00
# Execute a database-native SQL query, specifying the source.
$ sq sql --src=@pg1 'SELECT uid, username, email FROM person LIMIT 2'
2020-08-06 20:58:47 +03:00
# Copy a table (in the same source).
$ sq tbl copy @sakila_pg.actor .actor2
# Truncate table.
$ sq tbl truncate @sakila_pg.actor2
2020-08-06 20:58:47 +03:00
# Drop table.
$ sq tbl drop @sakila_pg.actor2
2020-08-06 20:58:47 +03:00
# Pipe an Excel file and output the first 10 rows from sheet1
$ cat data.xlsx | sq '.sheet1 | .[0:10]'`,
2020-08-06 20:58:47 +03:00
}
cmd.Flags().SortFlags = false
cmd.PersistentFlags().SortFlags = false
// The --help flag must be explicitly added to rootCmd,
// or else cobra tries to do its own (unwanted) thing.
// The behavior of cobra in this regard seems to have
// changed? This particular incantation currently does the trick.
cmd.PersistentFlags().Bool(flag.Help, false, "Show help")
2020-08-06 20:58:47 +03:00
addQueryCmdFlags(cmd)
cmd.Flags().Bool(flag.Version, false, flag.VersionUsage)
cmd.PersistentFlags().BoolP(flag.Monochrome, flag.MonochromeShort, false, flag.MonochromeUsage)
addOptionFlag(cmd.PersistentFlags(), OptProgress)
// TODO: Move the rest of the option flags over to addOptionFlag
cmd.PersistentFlags().BoolP(flag.Verbose, flag.VerboseShort, false, flag.VerboseUsage)
cmd.PersistentFlags().String(flag.Config, "", flag.ConfigUsage)
cmd.PersistentFlags().Bool(flag.LogEnabled, false, flag.LogEnabledUsage)
panicOn(cmd.RegisterFlagCompletionFunc(flag.LogEnabled, completeBool))
cmd.PersistentFlags().String(flag.LogFile, "", flag.LogFileUsage)
cmd.PersistentFlags().String(flag.LogLevel, "", flag.LogLevelUsage)
panicOn(cmd.RegisterFlagCompletionFunc(flag.LogLevel, completeStrings(
1,
slog.LevelDebug.String(),
slog.LevelInfo.String(),
slog.LevelWarn.String(),
slog.LevelError.String(),
)))
cmd.PersistentFlags().String(flag.LogFormat, "", flag.LogFormatUsage)
panicOn(cmd.RegisterFlagCompletionFunc(flag.LogFormat, completeStrings(
1,
string(format.Text),
string(format.JSON),
)))
2020-08-06 20:58:47 +03:00
return cmd
}