{"id":31525751,"url":"https://github.com/dvanderweele/lessqlite","last_synced_at":"2026-05-03T11:37:15.942Z","repository":{"id":62575679,"uuid":"367893663","full_name":"dvanderweele/lessqlite","owner":"dvanderweele","description":"A less-like command-line utility for easily paging through SQLite databases.","archived":false,"fork":false,"pushed_at":"2021-05-23T20:14:17.000Z","size":199,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-28T14:25:08.209Z","etag":null,"topics":["less","pager","python","python3","schema","sqlite","sqlite-databases"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dvanderweele.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-16T13:50:52.000Z","updated_at":"2021-05-23T20:14:19.000Z","dependencies_parsed_at":"2022-11-03T17:32:44.646Z","dependency_job_id":null,"html_url":"https://github.com/dvanderweele/lessqlite","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/dvanderweele/lessqlite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvanderweele%2Flessqlite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvanderweele%2Flessqlite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvanderweele%2Flessqlite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvanderweele%2Flessqlite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dvanderweele","download_url":"https://codeload.github.com/dvanderweele/lessqlite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvanderweele%2Flessqlite/sbom","scorecard":{"id":360698,"data":{"date":"2025-08-11","repo":{"name":"github.com/dvanderweele/lessqlite","commit":"fdc75c0ed1035780cf06d49a48152b31dc19d636"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.9,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":5,"reason":"binaries present in source code","details":["Warn: binary detected: dist/lessqlite-0.1.0-py3-none-any.whl:1","Warn: binary detected: dist/lessqlite-0.1.1-py3-none-any.whl:1","Warn: binary detected: dist/lessqlite-0.1.2-py3-none-any.whl:1","Warn: binary detected: dist/lessqlite-0.1.3-py3-none-any.whl:1","Warn: binary detected: dist/lessqlite-0.1.4-py3-none-any.whl:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/dvanderweele/lessqlite/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/dvanderweele/lessqlite/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/dvanderweele/lessqlite/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/dvanderweele/lessqlite/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/dvanderweele/lessqlite/test.yml/main?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.1.4 not signed: https://api.github.com/repos/dvanderweele/lessqlite/releases/43391340","Warn: release artifact v0.1.3 not signed: https://api.github.com/repos/dvanderweele/lessqlite/releases/43147173","Warn: release artifact v0.1.2 not signed: https://api.github.com/repos/dvanderweele/lessqlite/releases/43049769","Warn: release artifact v0.1.4 does not have provenance: https://api.github.com/repos/dvanderweele/lessqlite/releases/43391340","Warn: release artifact v0.1.3 does not have provenance: https://api.github.com/repos/dvanderweele/lessqlite/releases/43147173","Warn: release artifact v0.1.2 does not have provenance: https://api.github.com/repos/dvanderweele/lessqlite/releases/43049769"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"13 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-42986 / GHSA-43fp-rhv2-5gv8","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: PYSEC-2022-42969","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2021-108 / GHSA-q2q7-5pp4-w6pg","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f","Warn: Project is vulnerable to: GHSA-jfmj-5v4g-7637"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T10:47:11.320Z","repository_id":62575679,"created_at":"2025-08-18T10:47:11.321Z","updated_at":"2025-08-18T10:47:11.321Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32567794,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["less","pager","python","python3","schema","sqlite","sqlite-databases"],"created_at":"2025-10-03T18:50:57.642Z","updated_at":"2026-05-03T11:37:15.922Z","avatar_url":"https://github.com/dvanderweele.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# *lessqlite*\n\n![lessqlite](https://github.com/dvanderweele/lessqlite/actions/workflows/test.yml/badge.svg)\n[![Coverage Status](https://coveralls.io/repos/github/dvanderweele/lessqlite/badge.svg?branch=main)](https://coveralls.io/github/dvanderweele/lessqlite?branch=main)\n![PyPI](https://img.shields.io/pypi/v/lessqlite)\n![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/dvanderweele/lessqlite)\n![PyPI -Wheel](https://img.shields.io/pypi/wheel/lessqlite) \n![PyPI -Python Version](https://img.shields.io/pypi/pyversions/lessqlite) \n![License -MIT](https://img.shields.io/badge/License-MIT-blue)\n![PyPI - Downloads](https://img.shields.io/pypi/dm/lessqlite)\n\n`lessqlite` is a free command-line utility written in Python providing a pager-based interface (like Unix `less`) for exploring, browsing, and scrolling through SQLite databases in your terminal. \n\nThe program is powered by generator functions so that even SQLite databases of very large sizes can be paged through easily.\n\nIf you do anything interesting with this library, shoot me a link and I can feature it in this README.\n\n[Check out the YouTube Video.](https://www.youtube.com/watch?v=WYa2TInEZgY)\n\n## Installation\n\nIf you install `lessqlite` globally on your system via pip, you should be able to use it from anywhere:\n\n```\npip install lessqlite\n```\n\nOf course you can install it in a virtual environment as well for a project. Requires Python 3.7 or newer.\n\n## Usage\n\nThere are several different ways to use the tool so that you can customize your browsing experience. \n\nA good place to start is the root help page:\n\n```\nlessqlite --help\n```\n\nor\n\n```\nlessqlite -h\n```\n\n### Stats \n\nIf you aren't viewing the root help page (see previous section), you must provide a path to a valid SQLite database as an argument:\n\n```\nlessqlite example.db\n```\n\nSuch an invocation *will not* provide a pager interface for the database. Instead, it will print out a few simple statistics about your database.\n\n### Schema\n\nThe first subcommand is `schema`, and as its name suggests it allows you to browse the provided database's schema of tables and columns in a pager-based interface. \n\nFor example:\n\n```\nlessqlite example.db schema\n```\n\nThis subcommand has its own help page:\n\n```\nlessqlite example.db schema --help \n```\n\n### Tables\n\nThe `tables` subcommand is designed to be configurable enough to give you a comfortably flexible experience with browsing through an SQLite database in a terminal.\n\nIf you forget how the options work or if you want to see the short versions of the flags we will cover next, check the help page:\n\n```\nlessqlite example.db tables --help\n```\n\n#### TABLENAME Arguments\n\nThe `tables` subcommand accepts a variable number of arguments in the form of table names (0+). If no table names are provided as arguments, then all tables will be browsed instead. \n\nThe following command will allow you to scroll through all records in all tables:\n\n```\nlessqlite example.db tables \n```\n\nProviding one or more table names as arguments functions as a kind of whitelist of tables to page through. \n\nIn the following example, only the `student` and `instructor` tables will be paged through:\n\n```\nlessqlite example.db tables student instructor \n```\n\n#### Chunking\n\nBy default, the contents of each table will be selected in chunks of at most 10 records at a time from the database for feeding into the pager. It is possible to configure the chunk size with the option `--chunk`. \n\nThe following example will chunk the records 50 at a time:\n\n```\nlessqlite example.db tables --chunk 50\n```\n\nTo not chunk at all and instead pull each table into memory at once, pass 0 to the chunk option. Just be careful. For exceptionally large databases, this can be memory inefficient — or even memory impossible. \n\n#### Table Stats\n\nTo help you decide how to explore one or more tables, you can pass the `--stats` option, and the row count as well as other stats eill be displayed in the pager (rather than the actual rows of data). \n\nIn the following example, only stats will be displayed about the two named tables:\n\n```\nlessqlite example.db tables student instructor --stats \n```\n\n#### Truncating Fields\n\nAnother option to configure your experience of using the pager is the `--truncate` option. Pass a positive integer to it, and any field in any row with data of length surpassing the truncate option will be truncated to that length. \n\nIn the following example, all outputted fields in all rows of the specified table will have a max output length of 300 characters:\n\n```\nlessqlite example.db tables blog_post --truncate 300\n```\n\n#### Ranges of Records\n\nBy default, the pager will page through all records in each targeted table. For tables with lots of records, this may be more than you are really interested in. \n\nYou can specify at most one range of records for each table you'll be paging through. Each usage of the `--range` option takes exactly three arguments: the name of the table that the range applies to, an integer referring to the lower limit (inclusive) for records to be displayed, and an integer referring to the upper limit (inclusive) for records to be displayed. \n\nIn this example, the 51st through 60th records of the result set will be displayed:\n\n```\nlessqlite example.db tables student --range 51 60\n```\n\nNote, 51 to 60 is *not* necessarily synonymous with records with ids 51 to 60. \n\n#### Ordering Records\n\nThe `--orderby` option takes three arguments: a table name, the name of a column in that table, and either ASC or DESC. This allows you to sort the result set of columns according to a particular column before they are fed into the pager.\n\nYou may specify this option multiple times, one or more times per table. If a particular table is targeted by more than one option, it will apply the orderings in the order you specified them.\n\nFor example, sort the student table records by last_name in ascending order and the instructor table by id in descending order:\n\n```\nlessqlite example.db tables student instructor --orderby student last_name asc --orderby instructor id desc \n```\n\n\n\n\n\n\n\n\n\n\n\n\nSun May 23 20:13:57 UTC 2021\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdvanderweele%2Flessqlite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdvanderweele%2Flessqlite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdvanderweele%2Flessqlite/lists"}