Skip to main content

ata-db-models

Python version Code style with black More style with flake8 Imports with isort Type checking with mypy License

Database models and migrations for Automating the Ask.

Usage

As a package

We use SQLModel, a layer on top of SQLAlchemy with Pydantic, to define our tables. This is useful because we can import this package to interact with the tables AND have Pydantic objects in Python that correspond to a row in the table.

To install the package from PyPi, run: pip install ata-db-models. Check existing versions here.

Initialize a new cluster

If you want to initialize a fresh database cluster, pass in the env vars to connect to the cluster and run init_db. If the target cluster has IP restrictions, make sure your IP address is a valid access point.

An example run with fake credentials (from the root dir of this project with the virtual env activated): HOST=fakehost USER=fakeuser PASSWORD=fakepw DB_NAME=postgres python ata_db_models/db_init_stages/_0_init_db.py

This should run the most up-to-date SQLModel definitions of the tables, which means you are safe to then run any additional changes in role, access, and policy changes. So you can run the rest of the steps in db_init_stages, one after the other in ascending numerical order.

No PORT is passed because the default port is 5432, the standard for Postgres.

Migrations

So you made some changes to what tables there are, what columns there are, indices, etc. and you'd like to update the databases. This is what alembic is for!

To generate a new revision after you've updated the models:

  1. Run this from the root of the project: DB_CONNECTION_STRING='postgresql://user:password@host:port/db_name' alembic revision --autogenerate -m "message"
  2. Check the /alembic/versions/ directory for the new revision and verify that it does what you want it to
  3. Run this from the root of the project: DB_CONNECTION_STRING='postgresql://user:password@host:port/db_name' alembic upgrade head
  4. Note that you only need to generate the revision file (step 1) once because we want the same content in each environment's database, but you do need to run the upgrade head command once for each database (change the DB_NAME to the desired target).

To make new users, grant privileges, etc., follow the patterns used in db_init_stages along with the helpers under ata_db_models.

  1. Create a new file under db_init_stages that does what you want and is prefixed with _X_, where X is the next number (it has no function, it's just nice to keep track of the step order).
  2. Run the file. You can run it like so: HOST=fakehost USER=fakeuser PASSWORD=fakepw DB_NAME=postgres python ata_db_models/db_init_stages/_X_fake_file.py
  3. I'd recommend that you then connect to the cluster and verify your changes took place.

Note that you must provide valid host, user, password, and database name environment variables for it to work. The PORT env var has a default value of 5432, so it is omitted here. The only other env var you might need (if you are creating new roles/users that have credentials) is the ENABLE_SSM env var. By default it is FALSE but if you set it to TRUE then it will make sure to upload any new credentials to the SSM parameter store.

Development

This project uses Poetry to manage dependencies. It also helps with pinning dependency and python versions. We also use pre-commit with hooks for isort, black, and flake8 for consistent code style and readability. Note that this means code that doesn't meet the rules will fail to commit until it is fixed.

We use mypy for static type checking. This can be run manually, and the CI runs it on PRs to the main branch. We also use pytest to run our tests. This can be run manually and the CI runs it on PRs to the main branch.

Setup

  1. Install Poetry.
  2. Run poetry install --no-root
  3. Run source $(poetry env list --full-path)/bin/activate && pre-commit install && deactivate to set up pre-commit

You're all set up! Your local environment should include all dependencies, including dev dependencies like black. This is done with Poetry via the poetry.lock file.

Run Code Format and Linting

To manually run isort, black, and flake8 all in one go, simply run pre-commit run --all-files. Explore the pre-commit docs (linked above) to see more options.

Run Static Type Checking

To manually run mypy, simply run mypy from the root directory of the project. It will use the default configuration specified in pyproject.toml.

Update Dependencies

To update dependencies in your local environment, make changes to the pyproject.toml file then run poetry update from the root directory of the project.

Run Tests

To manually run rests, you need to have a Postgres instance running locally on port 5432. One way to do this is to run a Docker container, then run the tests while it is active.

  1. (If you don't already have the image locally) Run docker pull postgres
  2. Run docker run --rm --name postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_HOST_AUTH_METHOD=trust -p 127.0.0.1:5432:5432/tcp postgres
  3. Run DB_NAME=postgres pytest tests from the root directory of the project. Explore the pytest docs (linked above) to see more options.

Note that if you decide to run the Postgres container with different credentials (a different password, port, etc.) or via a different method, you will likely need to update the test file to point to the correct Postgres instance.

Additionally, if you want to re-run the tests, you want to make sure you start over from a fresh Postgres instance. If you run Postgres via Docker, you can simply ctrl-C to stop the image and start a new one.

Metadata

Release files for ata-db-models 0.0.19

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

Source distribution (sdist)

Source distribution for ata-db-models 0.0.19
File Size Uploaded Provenance
ata_db_models-0.0.19.tar.gz 12.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ata-db-models 0.0.19
File Interpreter ABI Platform
ata_db_models-0.0.19-py3-none-any.whl Python 3 none any Details

Total release size: 27.2 kB

Release files / ata_db_models-0.0.19.tar.gz

Download URL ata_db_models-0.0.19.tar.gz
Size 12.6 kB
Tags Source
SHA-256 checksum
How to use checksums
92e8894b46995850e73e513f7f20ea9f2b7f0678f600a3ea5b63fe68e22ad0b0
BLAKE2b-256 checksum
How to use checksums
ecd42b57f035c915c815d30be89309dd65648667fa3f0919df17228aa3a1cc46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.0 CPython/3.9.16 Linux/5.15.90.1-microsoft-standard-WSL2

Release files / ata_db_models-0.0.19-py3-none-any.whl

Download URL ata_db_models-0.0.19-py3-none-any.whl
Size 14.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
65fb18f013d5ee4dffc95ba0c65ebfe3d532e189c40559301e1854b51ee8a9ae
BLAKE2b-256 checksum
How to use checksums
86722f870082478bf494445e6ab60df4fef44eac2f2285071d356588c4c84cca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.0 CPython/3.9.16 Linux/5.15.90.1-microsoft-standard-WSL2

Security for ata-db-models 0.0.19

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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