Skip to main content

Copia logo

Copia

CI PyPI License Docs Ruff Python

Seed your database without the hassle.


Copia TUI preview

Editor, preview, and log panels — all in your terminal.


Seeding a database with realistic data is tedious. Most frameworks ship a seeder with questionable decisions, or don't ship one at all.

Copia gives you a declarative language and a TUI to describe, preview, and insert data — without boilerplate, without framework dependency.

Why Copia

You have this table:

CREATE TABLE users (
  id           CHAR(36)      NOT NULL PRIMARY KEY,
  username     VARCHAR(50)   NOT NULL UNIQUE,
  email        VARCHAR(255)  NOT NULL UNIQUE,
  password     VARCHAR(255)  NOT NULL,
  role         ENUM('admin', 'editor', 'viewer') NOT NULL,
  created_at   DATE          NOT NULL
);

Without Copia:

INSERT INTO users (id, username, email, password, role, created_at)
VALUES
  ('a1b2c3d4-...', 'john_doe',   'john@example.com',   '$2b$12$...', 'admin',  '2023-04-12'),
  ('e5f6g7h8-...', 'jane_smith', 'jane@example.com',   '$2b$12$...', 'editor', '2024-01-05'),
  ('i9j0k1l2-...', 'bob_99',     'bob@example.com',    '$2b$12$...', 'viewer', '2022-11-30'),
  ('m3n4o5p6-...', 'alice_w',    'alice@example.com',  '$2b$12$...', 'admin',  '2023-08-19'),
  ('q7r8s9t0-...', 'charlie_k',  'charlie@example.com','$2b$12$...', 'editor', '2024-03-02');
  -- ... 55 more rows. good luck with that.

With Copia:

id:          uuid()
username:    username()
email:       email(safe=True)
password:    password(length=16)
role:        enum('admin', 'editor', 'viewer')
created_at:  past_date()
copia run --table users users.copia --rows 60

Done.

Features

  • Simple language — if you know what a function call looks like, you know the Copia DSL
  • Realistic data — built on Faker, 25+ generators out of the box
  • Relational-aware — fetch('table.column') samples from existing rows, so foreign keys just work
  • Interactive TUI — write, preview, and insert without leaving your terminal
  • Scriptable — pipe input, dump to JSON/CSV/SQL, skip confirmation prompts

Installation

pip install copia-seed

Requires Python 3.10+. MySQL and MariaDB included. PostgreSQL available as an optional dependency.

Quickstart

copia init      # create a config file
copia tui       # launch the interactive TUI

Or run directly from the CLI:

copia run --dumps json users.copia --skip-config
echo "id:uuid() name:username()" | copia run --dumps json --skip-config

Usage

For detailed usage instructions, see the CLI documentation.

copia's main entry point is the copia command, which has several subcommands for different tasks:

  • copia tui : launch the interactive TUI (requires a valid config profile)
  • copia run : parse and run a file content, with options for dumping output, skipping confirmation, and more
  • copia list : list all available profiles in the config files
  • copia init : create a new config file with a default profile

Configuration

Copia config files are TOML files that define what we call "profiles".

Those profiles are just named sets of configuration values, that tell copia how to connect to the database.

a config file can have multiples profiles and usually looks like this:

[profiles.default]
adapter = "mysql"
host = "localhost"
port = 3306
database = "mydb"
user = "root"

[profiles.staging]
adapter = "postgres"
host = "staging-db.example.com"
port = 5432
database = "stagingdb"
user = "admin"
password = "Y@urRe@lly$trongP@ssw0rd"

any command that takes a profile name as an argument or flag will assume the "default" profile if the name is not provided, so in the example above, both copia tui and copia tui staging will work without issues.

Scopes

copia supports two scopes for configuration profiles: global and local.

the global config file is usually located at {CONFIG_DIR}/copia/profiles.toml and is meant to store profiles that are shared across all your projects.

while the local config file is located at .copia.toml in your project directory and is meant to store profiles that are specific to that project.

In some situations, you might want to limit the search for profiles to a specific config file.

For example you might have a profile named "staging" in both your global and local config files, but with different connection details, and you want to make sure you're using the one in the global config file.

Documentation

→ For more details on copia see the documentation


MIT License

Metadata

Release files for copia-seed 0.3.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for copia-seed 0.3.2
File Size Uploaded
copia_seed-0.3.2.tar.gz 2.1 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for copia-seed 0.3.2
File Interpreter ABI Platform
copia_seed-0.3.2-py3-none-any.whl Python 3 none any Details

Total release size: 2.2 MB

Release files / copia_seed-0.3.2.tar.gz

Download URL copia_seed-0.3.2.tar.gz
Size 2.1 MB
Tags Source
SHA-256 checksum
How to use checksums
bd2c7bc43ccf854d3130c9e6c0c0feb9ed9aa3867b2ed8389ee8c7dc6cffe594
BLAKE2b-256 checksum
How to use checksums
18911813c77b22c8b7350cf095e694bbe103aa36b2d88f1d85f8f8813c200adf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 27, 2026.

Transparency log

Release files / copia_seed-0.3.2-py3-none-any.whl

Download URL copia_seed-0.3.2-py3-none-any.whl
Size 54.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ae2333efa6ec69a7b4936af7f68c093971f6e0ea18e10a747e7f421da6cb0a5e
BLAKE2b-256 checksum
How to use checksums
9f3140d0f4f3169828f73d4ae90469ec08430765b29dc35973e3f03d6afcf90c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.2 This release

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page