Jailer: the model writes the WHERE clause that decides what leaves production
Database Subsetting and Relational Data Browsing Tool.
At a glance
- What is it?
- Jailer is a Java tool that extracts small, referentially intact slices of a database, primarily to copy rows out of production into development and test. It also archives obsolete data, browses relationships in both directions, rewrites SQL you paste, and ships three assistants that generate the subset boundary and the queries from natural language.
- Who is it for?
- Jailer fits a team that has a production database too large to copy and too entangled to query, and that needs a small, reproducible subset with its foreign keys intact. Verify four things before you point it at anything real.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 8 days ago.
- What is it written in?
- Mainly Java, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- Wisser/Jailer3,220 ★ · +16
| Repository | 2026-09-24 | 2026-11-14 |
|---|---|---|
| Wisser/Jailer | 3.2k | 3.2k |
16 Stars in the last 51 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The primary job is copying rows out of a production database
The stated purpose of the subsetter is to create small slices that are consistent and referentially intact, and the first feature says where they come from and where they go: exported from your productive database and imported into your development and test environment. The same paragraph names the second use, creating small samples of test data or doing local problem analysis with relevant production data. So the tool's normal operating mode is a copy of real rows out of a live system into a lower environment, and that is the fact to hold on to when reading everything else. The second feature goes further in the opposite direction: removing and archiving obsolete data without violating integrity. The referential machinery that makes an extract safe is the same machinery that makes a bulk removal safe, which is useful for housekeeping and is exactly why the connection deserves care.
A SQL console that can add filter conditions to arbitrary queries
The feature list puts a SQL console in fifth position, between data browsing and the assistants, described as offering code completion, syntax highlighting, charts and metadata visualisation. A news entry from 2023 explains what it does that a console normally cannot: the tool analyses statements deeply enough to relate a query's result rows back to the tables they came from and display them accordingly, and the same technique lets it add filter conditions dynamically to arbitrary SQL. So it is not only an editor, it is a rewriter. Put beside the browsing feature, which navigates relationships bidirectionally from any row, and you have a tool that can walk from production data in either direction and then alter a query you handed it. All of that is the point of the product and all of it operates on whatever connection is configured.
The assistant generates the subject table, the condition and the restrictions
The subsetting assistant takes a natural-language description of what data to subset and generates three things: the subject table, the WHERE condition, and the association restrictions. Those three outputs are exactly the subset boundary, so the decision about which production rows get copied out is made by a language model reading a sentence. That is a reasonable design and it is also the single thing in this tool most worth a second look, because a wrong boundary is not visibly wrong. The query assistant is the same shape for reading rather than copying: it generates SQL from a natural-language question, with what the file calls smart table selection for large schemas, and the advisor analyses and refactors SQL you already have, with a menu of common tasks and an inline diff. Providers are Anthropic or an OpenAI-compatible endpoint, five of which are named. Your schema's table and column names are part of what gets sent, and the file names a local endpoint option if that matters to you.
Referential intactness comes from propagating key filters to foreign keys
The mechanism behind the tool's central promise is stated once, in a news entry from 2017: templates let you define rules for assigning filters to columns, and a filter placed on a primary key column is automatically propagated to the corresponding foreign key columns. That single rule is what makes a two-table extract come back joined. Two other entries fill in the edges. Cycles in parent-child relationships are detected and broken, so self-referential data can be exported by deferring the insertion of nullable foreign keys until the rows they point at exist. And the generated SQL is topologically sorted, so the insert order already respects the constraints. The output is not one format but five: sorted SQL DML, hierarchically structured JSON, YAML, XML and DbUnit datasets.
Read-only sources are handled by staging rows into an embedded database
There are three older entries that answer the practical objections before you ask them. A read-only source is handled by collecting rows into a separate embedded database first, so the tool never needs write access to production to take a slice. A source you cannot reach from the network is handled by a 2024 integration that generates DDL scripts for creating database objects, using an external schema-migration tool, so a subset database can be built from nothing but the schema and then populated. And performance is addressed by exporting directly into a schema on the same database server rather than shipping the statements across a connection. There is also a subset-by-example feature from 2016: browse to the rows you want and let the tool derive the model for that subset. Taken together these are what make the tool usable in a pipeline that must not touch production at all.
Thirteen named databases, any JDBC database in principle, one typo
Support is claimed in two tiers, and the file is upfront about it: because the tool goes through JDBC, any database management system is in principle supported, and for best results there are additional support features for thirteen specific ones. The named list covers the usual commercial and open-source set plus a few you would not predict, including a columnar warehouse, an embedded engine, two more embedded engines, and an analytical database. The two-tier claim is what makes the tool portable and also what makes it untested by default, so the tier matters more than the count. The tier-one list is data rather than code: a comma-separated driver list sits at the repository root, which is how the claim is implemented. The sentence that introduces the tier contains a typo, with the acronym's letters transposed.
A prebuilt executable and a jar are committed at the repository root
Cloning the repository gives you a runnable program without building anything. A Windows executable and a jar are committed at the top level, alongside four launcher scripts for Windows and Unix, and the installation instructions offer both packaged installers and an archive for people who bring their own Java or want the command line interface. Around those sit a directory of vendored libraries, a directory of build artefacts from the other build system, a temporary directory, and a pair of Eclipse project files. The build itself is Ant, driven by one build file at the root, with no Maven or Gradle project file at that level even though the engine is published to a Maven repository under a group id derived from the project's own pages domain. A temporary directory and vendored binaries in version control are the two entries that will age worst.
Two installers, three placeholder styles, and a support address on an old forge
The installation section names two packaged files: a Windows installer whose version placeholder is written with dots, and a Linux package for 64-bit whose placeholder is written with underscores. The archive for the command line interface uses the dotted form again. So three filenames, two placeholder conventions, and no macOS installer even though the start instructions list macOS among the platforms you can launch from. The same section has a grammar error in its second sentence, and it points at a separate FAQ page for the multi-user question rather than answering it. The contact block is the other loose end: the project lives on GitHub with its own pages site, and the home line still offers the old forge over plain http, the forum is still on that forge, and support mail goes to a personal handle at that forge's users domain, while funding is handled through a different platform entirely.
Editorial conclusion
Jailer fits a team that has a production database too large to copy and too entangled to query, and that needs a small, reproducible subset with its foreign keys intact. Verify four things before you point it at anything real. Decide who can reach the SQL console, because arbitrary query execution plus dynamic filter rewriting is the widest capability in the list and it sits on the same connection as the subsetter. Decide where the assistant's schema context goes, since sending natural language questions about your tables to a hosted endpoint means table and column names leave your environment, and the local endpoint is the only way to keep them in. Read the archiving feature before you enable it, because the referential machinery that makes an extract safe is the same machinery that makes a bulk delete safe. And build subsets in continuous integration from the schema alone, which the schema-generation integration makes possible and which avoids the question entirely.
Frequently asked questions
What is Wisser/Jailer?
A Java tool for database subsetting and relational data browsing. The subsetter extracts small slices of rows that are consistent and referentially intact, as topologically sorted SQL, DbUnit datasets, XML, JSON or YAML, and imports them into development and test environments. The browser navigates between tables along foreign-key or user-defined relationships in both directions.
Which databases does Jailer support?
Any database reachable through JDBC is supported in principle, and thirteen specific ones get additional support features, ranging from the usual relational engines to a columnar warehouse and two embedded engines. A comma-separated driver list at the repository root is how that list is implemented, so adding a database means adding a driver rather than changing code.
Can Jailer take a subset from a read-only production database?
Yes. A documented approach collects the selected rows into a separate embedded database first, so the tool never needs write access to the source. There is also a documented path that avoids data entirely for pipelines: generate the schema-creation scripts for a subset database from nothing but the model, then populate it.
What do the AI assistants in Jailer actually generate?
The subsetting assistant takes a natural-language description and generates the subject table, the WHERE condition and the association restrictions, which together are the subset boundary. The query assistant generates SQL from a question, with table selection for large schemas, and the advisor analyses existing SQL. Providers are Anthropic or an OpenAI-compatible endpoint, five of which are named, plus a local endpoint option.
How does Jailer keep an exported subset referentially intact?
Templates let you assign filters to columns, and a filter on a primary key column is propagated automatically to the corresponding foreign key columns. Cycles in parent-child relationships are detected and broken by deferring insertion of nullable foreign keys, and the generated SQL is topologically sorted so insert order already respects the constraints.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/wisser-jailer)Star history chart for your README
[](https://hysenlabs.com/projects/wisser-jailer)Was this useful?