wp-cli / ideas

💡 Ideas and feature requests are collected here
40 stars 1 forks source link

Add commands to export and import SQLite databases #188

Open danielbachhuber opened 3 months ago

danielbachhuber commented 3 months ago

For increased compatibility with SQLite, it would be nice to be able to:

I think these features could live inside of wp db export and wp db import.

wojtekn commented 3 months ago

We could consider to have SQLite-MySQL and MySQL-SQLite implementation a part of https://github.com/wordPress/sqlite-database-integration/.

wojtekn commented 3 months ago

I talked with @schlessera and came up with the proposed plan:

  1. Create a separate repository that holds the PHP library that supports:
    • Exporting MySQL database to MySQL dump (using mysqldump like WP-CLI does now)
    • Exporting MySQL database to SQLite dump
    • Exporting SQLite database to SQLite dump
    • Exporting SQLite database to MySQL dump
    • And importing for all of the above cases
  2. Use the library as a composer dependency of db-command
  3. Refactor DB_Command::import() and DB_Command::export() to use the new library
  4. Automatically guess the imported database format
  5. Add support for --dialect option for wp db export to let the user choose MySQL or SQLite dialect

Then, other WP tools, like Sandbox Site powered by Playground or the sqlite-database-integration plugin, could reuse the import/export library.

Any thoughts? What feedback do you have?

CC @danielbachhuber @adamziel

danielbachhuber commented 3 months ago

This seems reasonable, although I would prefer to implement as a WP-CLI command first and then figure out the abstraction. I think the abstraction could quickly rabbit hole into zero progress.

schlessera commented 3 months ago

@danielbachhuber I get the concern, but I think the entire point here is to build something reusable. The way WP-CLI commands are usually built just results in spaghetti code that can hardly be salvaged - unless you have a strict conceptual separation from the start, at which point a distribution via a separate package is just a minor detail. With a separate package, we can reuse that package on 2 or more fronts at the same time to make sure we exchange data. I'll help with the architectural design to ensure we do this iteratively and don't get stuck along the way.

danielbachhuber commented 3 months ago

@schlessera Ok. We need a version of this in the short term, though. @wojtekn Maybe our first draft can be an internal implementation, and then we can produce a final version as a public library?

adamziel commented 3 months ago

+1 on separating this from a start. Starting as an internal implementation sounds good if that's later turned into a reusable library.

Exporting MySQL database to MySQL dump Exporting MySQL database to SQLite dump Exporting SQLite database to SQLite dump Exporting SQLite database to MySQL dump

All these combinations are covered by a single, existing exporter.

The existing Sandbox Site plugin produces a MySQL-compliant dump from either MySQL or SQLite. That dump can then be imported into MySQL verbatim, or into SQLite using the SQLite database integration plugin.

Exporting MySQL database to MySQL dump (using mysqldump like WP-CLI does now)

mysqldump is great as an option when it's available. When it isn't installed or accessible (proc_open may be disabled) the PHP exporter fallback would still be useful. That's the only way we could eventually make it a part of WordPress core.

Looping in @brandonpayton.

wojtekn commented 2 months ago

We work on that under https://github.com/wp-cli/db-command/pull/259