Skip to main content

It converts django models to a sqlalchemy orm/expression objects.

Project description

https://circleci.com/gh/righ/d2a.svg?style=svg

Requirements

  • Python: 2.7.15 or later, 3.4 or later.

    • Tested with 2.7.15, 3.6

  • Django: 1.9 or later.

    • Tested with 1.11, 2.0, 2.1

  • SQLAlchemy: 0.9 or later.

    • Tested with 1.2

Installation

$ pip install d2a

Usage

Auto loading

Just add d2a to settings.INSTALLED_APPS.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # apps
    'books',
    'sales',

    # auto loads models
    'd2a',
]

Then models_sqla (default) in all apps become possible to be imported as a module.

>>> from books import models_sqla
>>> models_sqla.  # tab completion
models_sqla.Author(            models_sqla.BookCategory(      models_sqla.CategoryRelation(  models_sqla.transfer(
models_sqla.Book(              models_sqla.Category(          models_sqla.models

>>> models_sqla.Book
<class 'd2a.book'>

>>> models_sqla.Book.  # tab completion
models_sqla.Book.author       models_sqla.Book.content      models_sqla.Book.metadata     models_sqla.Book.tags
models_sqla.Book.author_id    models_sqla.Book.description  models_sqla.Book.mro(         models_sqla.Book.title
models_sqla.Book.category     models_sqla.Book.id           models_sqla.Book.price
# SQL Expression schema
>>> models_sqla.Book.__table__
Table(
  'book', MetaData(bind=None),
  Column('id', UUID(), table=<book>, primary_key=True, nullable=False, default=ColumnDefault(<function uuid4 at 0x7f3cebe7e598>)),
  Column('price', JSON(astext_type=Text()), table=<book>, nullable=False),
  Column('title', VARCHAR(length=255), table=<book>, nullable=False),
  Column('description', TEXT(), table=<book>),
  Column('author_id', INTEGER(), ForeignKey('author.id'), table=<book>),
  Column('content', BYTEA(), table=<book>, nullable=False),
  Column('tags', ARRAY(VARCHAR()), table=<book>, nullable=False),
  schema=None
)

Also, it can extract model declared implicitly depending on m2m field. (in this case, BookCategory)

Per models module

If you want to create a module manually, create a models_sqla.py in the apps.

Write like the following to it`:

from d2a import transfer
from . import models
transfer(models, globals())

models_sqla.py exists, auto module creation will be omitted.

And if you create every models_sqla.py manually, it is unnecessary to set d2a to settings.INSTALLED_APPS.

Example:

  • project_postgresql/books/models_sqla.py

  • You can omit specifying db_type, then it automatically detects a database type from settings.DATABASES['default'].

    • Now postgresql, mysql and oracle are allowed, the other types will be converted to the following types as default type: sqlalchemy/types.py

Per model

If you just want to convert one model, you should use declare function.

>>> from d2a import declare
>>> from sales.models import Sales
>>> sales = declare(Sales)
>>> sales
<class 'd2a.sales'>

>>> sales.__table__
Table(
  'sales', MetaData(bind=None),
  Column('id', BIGINT(), table=<sales>, primary_key=True, nullable=False),
  Column('book_id', UUID(), ForeignKey('book.id'), table=<sales>, nullable=False),
  Column('sold', TIMESTAMP(), table=<sales>, nullable=False),
  Column('reservation', INTERVAL(), table=<sales>),
  Column('source', INET(), table=<sales>),
  schema=None
)

>>> sales.
sales.book         sales.id           sales.mro(         sales.sold
sales.book_id      sales.metadata     sales.reservation  sales.source

Custom fields

If you are using customized field not built-in, you can register the field as the other field using alias or alias_dict method.

from django.db.models import ImageField

class ExtendedImageField(ImageField):
    """something customizing"""

from d2a import alias
alias(ExtendedImageField, ImageField)

# or
alias_dict({
  ExtendedImageField: ImageField,
})

Demo

start up environment

$ git clone git@github.com:righ/d2a.git
$ cd d2a
$ docker-compose up

preparation

$ docker exec -it d2a_app_1 /bin/bash
# python -m venv venv # only first time
# source venv/bin/activate
(venv) # cd project_postgresql/ # (or mysql)
(venv) project_postgresql # ./manage.py migrate

execute

(venv) project_postgresql # ./manage.py shell
>>> from books import models_sqla
>>> book = models_sqla.Book()
>>> author = models_sqla.Author()
>>> book.author = author
>>> author.books
[<d2a.book object at 0x7f3cec539358>]
# And do something you want do ;)

History

1.1.0:
  • (2019-02-17)

  • Added a function to load all models automatically.

1.0.2:
  • (2018-07-10)

  • Improved a little.

1.0.1:
  • (2018-07-06)

  • Fixed a bug, that it will be provided None even though it’s not specified default argument.

1.0.0:
  • (2018-07-05)

  • Fixed bugs.

  • Added unit tests.

0.0.6:
  • Fixed a bug that abstract models become the targets.

  • Deleted install_requires.

0.0.5:
  • added alias method.

0.0.4:
  • fixed bugs.

0.0.3:
  • it got easy to declare custom field.

  • transfer method can define secondary table.

0.0.2:
  • it supported m2m field.

  • it limited django version less than 1.9.

0.0.1:

first release (2017-12-27)

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

d2a-1.1.0.tar.gz (8.4 kB view details)

Uploaded Source

Built Distribution

d2a-1.1.0-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file d2a-1.1.0.tar.gz.

File metadata

  • Download URL: d2a-1.1.0.tar.gz
  • Upload date:
  • Size: 8.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.4

File hashes

Hashes for d2a-1.1.0.tar.gz
Algorithm Hash digest
SHA256 f43e512a6566b014a93eab5fcad55ad17b793a872ec20a0571abb2bf1b7bc3c4
MD5 3d2fa4bddcaf7657f319ee297ef465db
BLAKE2b-256 aa481d9ba229c06e0c64ab8bf3bc406bc96b1167b25249fd094f71c1bac3fb6b

See more details on using hashes here.

File details

Details for the file d2a-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: d2a-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.4

File hashes

Hashes for d2a-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a200379bcb26730b76b728a3d48fe934719a84a5d9100f35b3140902209ec43d
MD5 a4e52845cb15a41b95b5f8092aa81cd6
BLAKE2b-256 a3453affb96a8c19b7ef18cf9f70f21ac163c97023c77ced26023d0fd8f37fc6

See more details on using hashes here.

Supported by

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