Skip to main content

SQLAlchemy seeder

Project description

sqlalchemyseed

PyPI PyPI - Python Version PyPI - License Python package Build Status

Sqlalchemy seeder that supports nested relationships.

Installation

Default installation

pip install sqlalchemyseed

When using yaml to loading entities from yaml files. Execute this command to install necessary dependencies

pip install sqlalchemyseed[yaml]

Dependencies

Required

  • SQAlchemy>=1.4.0

Optional

  • PyYAML>=5.4.0

Getting Started

# main.py
from sqlalchemyseed import load_entities_from_json, Seeder
from db import session

# load entities
entities = load_entities_from_json('tests/test_data.json')

# Initializing Seeder
seeder = Seeder()  # or Seeder(session)

# Seeding
seeder.session = session  # assign session if no session assigned before seeding
seeder.seed(entities)

# Committing
session.commit()  # or seeder.session.commit()

Seeder vs. HybridSeeder

Features & Options Seeder HybridSeeder
Support model and data keys :heavy_check_mark: :heavy_check_mark:
Support model and filter keys :x: :heavy_check_mark:
Optional argument add_to_session=False in the seed method :heavy_check_mark: :x:
Assign existing objects from session or db to a relationship attribute :x: :heavy_check_mark:

When to use HybridSeeder and 'filter' key field?

Assuming that Child(age=5) exists in the database or session, then we should use filter instead of data, the values of filter will query from the database or session, and assign it to the Parent.child

from sqlalchemyseed import HybridSeeder
from db import session

data = {
    "model": "models.Parent",
    "data": {
        "!child": {
            "model": "models.Child",
            "filter": {
                "age": 5
            }
        }
    }
}


# When seeding instances that has 'filter' key, then use HybridSeeder, otherwise use Seeder.
seeder = HybridSeeder(session)
seeder.seed(data)

session.commit() # or seeder.sesssion.commit()

Relationships

In adding a relationship attribute, add prefix ! to the key in order to identify it.

Referencing relationship object or a foreign key

If your class don't have a relationship attribute but instead a foreign key attribute you can use it the same as how you did it on a relationship attribute

from sqlalchemyseed import HybridSeeder
from db import session

instance = [
    {
        'model': 'tests.models.Company',
        'data': {'name': 'MyCompany'}
    },
    {
        'model': 'tests.models.Employee',
        'data':[  
            {
                'name': 'John Smith',
                # foreign key attribute
                '!company_id': {
                    'model': 'tests.models.Company',
                    'filter': {
                        'name': 'MyCompany'
                    }
                }
            },
            {
                'name': 'Juan Dela Cruz',
                # relationship attribute
                '!company': {
                    'model': 'tests.models.Company',
                    'filter': {
                        'name': 'MyCompany'
                    }
            }
        ]
    }
]

seeder = HybridSeeder(session)
seeder.seed(instance)

No Relationship

// test_data.json
[
    {
        "model": "models.Person",
        "data": {
            "name": "You",
            "age": 18
        }
    },
    // when you have two or more objects of the same model, you can
    {
        "model": "models.Person",
        "data": [
            {
                "name": "You",
                "age": 18
            },
            {
                "name": "Still You But Older",
                "age": 40
            }
        ]
    }
]

One to One

// test_data.json
[
    {
        "model": "models.Person",
        "data": {
            "name": "John",
            "age": 18,
            // creates a job object
            "!job": {
                "model": "models.Job",
                "data": {
                    "job_name": "Programmer",
                }
            }
        }
    },
    // or this, if you want to add relationship that exists
    // in your database use 'filter' instead of 'obj'
    {
        "model": "models.Person",
        "data": {
            "name": "Jeniffer",
            "age": 18,
            "!job": {
                "model": "models.Job",
                "filter": {
                    "job_name": "Programmer",
                }
            }
        }
    }
]

One to Many

//test_data.json
[
    {
        "model": "models.Person",
        "data": {
            "name": "John",
            "age": 18,
            "!items": [
                {
                    "model": "models.Item",
                    "data": {
                        "name": "Pencil"
                    }
                },
                {
                    "model": "models.Item",
                    "data": {
                        "name": "Eraser"
                    }
                }
            ]
        }
    }
]

Example of Nested Relationships

{
    "model": "models.Parent",
    "data": {
        "name": "John Smith",
        "!children": [
            {
                "model": "models.Child",
                "data": {
                    "name": "Mark Smith",
                    "!children": [
                        {
                            "model": "models.GrandChild",
                            "data": {
                                "name": "Alice Smith"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sqlalchemyseed-0.4.3.tar.gz (7.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sqlalchemyseed-0.4.3-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

File details

Details for the file sqlalchemyseed-0.4.3.tar.gz.

File metadata

  • Download URL: sqlalchemyseed-0.4.3.tar.gz
  • Upload date:
  • Size: 7.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for sqlalchemyseed-0.4.3.tar.gz
Algorithm Hash digest
SHA256 9995cf0224320f8db5af5a51ec80fa67dec712bbc586e8f811905e78660177c6
MD5 730f434312bf3d87cb67a88ab9978327
BLAKE2b-256 a0073737ee5b1b7d590bd5504281e8eb230e3a74f188eae21e7a9bb60a7b1e92

See more details on using hashes here.

File details

Details for the file sqlalchemyseed-0.4.3-py3-none-any.whl.

File metadata

  • Download URL: sqlalchemyseed-0.4.3-py3-none-any.whl
  • Upload date:
  • Size: 10.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for sqlalchemyseed-0.4.3-py3-none-any.whl
Algorithm Hash digest
SHA256 3470f895b54ee2e1bf1e917b180681ae5804979483a636ea82e8a3a3163af972
MD5 223b03e516f3be2a1e177b31b6411ca7
BLAKE2b-256 14ad11679d958169ddc12d25242bda983d331cde22955a9e76db41ba7d5c508a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page