{ "info": { "author": "Awesome Toolbox", "author_email": "info@awesometoolbox.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP" ], "description": "# Ormantic\n\nThe `ormantic` package is an async ORM for Python, with support for Postgres,\nMySQL, and SQLite. Ormatic is a fork from [`ORM`][orm] for the purpose of\nintegrating with [`FastAPI`][fastapi] and is built with:\n\n* [SQLAlchemy core][sqlalchemy-core] for query building.\n* [`databases`][databases] for cross-database async support.\n* [`pydantic`][pydantic] for data validation.\n\nBecause ORM is built on SQLAlchemy core, you can use Alembic to provide\ndatabase migrations.\n\n**Note**: Use `ipython` to try this from the console, since it supports `await`.\n\n```python\nimport databases\nimport sqlalchemy\nimport ormantic as orm\n\ndatabase = databases.Database(\"sqlite:///db.sqlite\")\nmetadata = sqlalchemy.MetaData()\n\n\nclass Note(orm.Model):\n id: orm.Integer(primary_key=True) = None\n text: orm.String(max_length=100)\n completed: orm.Boolean() = False\n\n class Mapping:\n table_name = \"notes\"\n database = database\n metadata = metadata\n\n\n# Create the database\nengine = sqlalchemy.create_engine(str(database.url))\nmetadata.create_all(engine)\n\n# .create()\nawait Note.objects.create(text=\"Buy the groceries.\", completed=False)\nawait Note.objects.create(text=\"Call Mum.\", completed=True)\nawait Note.objects.create(text=\"Send invoices.\", completed=True)\n\n# .all()\nnotes = await Note.objects.all()\n\n# .filter()\nnotes = await Note.objects.filter(completed=True).all()\n\n# exact, iexact, contains, icontains, lt, lte, gt, gte, in\nnotes = await Note.objects.filter(text__icontains=\"mum\").all()\n\n# .get()\nnote = await Note.objects.get(id=1)\n\n# .update()\nawait note.update(completed=True)\n\n# .delete()\nawait note.delete()\n\nnote = await Note.objects.get(id=2)\nassert note.pk == note.id == 2\n```\n\nOrmantic supports loading and filtering across foreign keys...\n\n```python\nimport databases\nimport sqlalchemy\nimport ormantic as orm\n\ndatabase = databases.Database(\"sqlite:///db.sqlite\")\nmetadata = sqlalchemy.MetaData()\n\n\nclass Album(orm.Model):\n id: orm.Integer(primary_key=True) = None\n name: orm.String(max_length=100)\n\n class Mapping:\n table_name = \"album\"\n metadata = metadata\n database = database\n\nclass Track(orm.Model):\n id: orm.Integer(primary_key=True) = None\n album: orm.ForeignKey(Album)\n title: orm.String(max_length=100)\n position: orm.Integer()\n\n class Mapping:\n table_name = \"track\"\n metadata = metadata\n database = database\n\n# Create the database\nengine = sqlalchemy.create_engine(str(database.url))\nmetadata.create_all(engine)\n\n#\u00a0Create some records to work with.\nmalibu = await Album.objects.create(name=\"Malibu\")\nawait Track.objects.create(album=malibu, title=\"The Bird\", position=1)\nawait Track.objects.create(album=malibu, title=\"Heart don't stand a chance\", position=2)\nawait Track.objects.create(album=malibu, title=\"The Waters\", position=3)\n\nfantasies = await Album.objects.create(name=\"Fantasies\")\nawait Track.objects.create(album=fantasies, title=\"Help I'm Alive\", position=1)\nawait Track.objects.create(album=fantasies, title=\"Sick Muse\", position=2)\n\n# Fetch an instance, without loading a foreign key relationship on it.\ntrack = await Track.objects.get(title=\"The Bird\")\n\n#\u00a0We have an album instance, but it only has the primary key populated\nprint(track.album) # Album(id=1) [sparse]\nprint(track.album.pk) # 1\nprint(track.album.name) # Raises AttributeError\n\n# Load the relationship from the database\nawait track.album.load()\nassert track.album.name == \"Malibu\"\n\n# This time, fetch an instance, loading the foreign key relationship.\ntrack = await Track.objects.select_related(\"album\").get(title=\"The Bird\")\nassert track.album.name == \"Malibu\"\n\n# Fetch instances, with a filter across an FK relationship.\ntracks = Track.objects.filter(album__name=\"Fantasies\")\nassert len(tracks) == 2\n\n# Fetch instances, with a filter and operator across an FK relationship.\nassert Track.objects.filter(album__name__iexact=\"fantasies\").count() == 2\n```\n\n## Data types\n\nThe following keyword arguments are supported on all field types.\n\n* `primary_key`\n* `allow_null`\n* `index`\n* `unique`\n\nThe following column types are supported:\n\n* `orm.Boolean()`\n* `orm.Date()`\n* `orm.DateTime()`\n* `orm.Enum()`\n* `orm.Float()`\n* `orm.Integer()`\n* `orm.JSON()`\n* `orm.String(max_length)`\n* `orm.StringArray()`\n* `orm.Text()`\n* `orm.Time()`\n\n[sqlalchemy-core]: https://docs.sqlalchemy.org/en/latest/core/\n[orm]: https://github.com/encode/orm/\n[fastapi]: https://github.com/tiangolo/fastapi/\n[databases]: https://github.com/encode/databases/\n[pydantic]: https://github.com/samuelcolvin/pydantic/\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/awesometoolbox/ormantic", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "ormantic", "package_url": "https://pypi.org/project/ormantic/", "platform": "", "project_url": "https://pypi.org/project/ormantic/", "project_urls": { "Homepage": "https://github.com/awesometoolbox/ormantic" }, "release_url": "https://pypi.org/project/ormantic/0.0.29/", "requires_dist": [ "databases (>=0.2.1)", "pydantic (==0.29)" ], "requires_python": "", "summary": "Async ORM + Pydantic = Ormantic \u2764\ufe0f", "version": "0.0.29" }, "last_serial": 5465314, "releases": { "0.0.29": [ { "comment_text": "", "digests": { "md5": "c421729f173c3d633d2a80d83cb717ca", "sha256": "4a2888954166b8243a4eda5ba8ea311766e0a19469067e81f4d5c78d1003d71c" }, "downloads": -1, "filename": "ormantic-0.0.29-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c421729f173c3d633d2a80d83cb717ca", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10072, "upload_time": "2019-06-29T12:47:57", "url": "https://files.pythonhosted.org/packages/97/30/ee6afcbf776480cace733b831d372bad4a24a62e71fe62bb00007909681e/ormantic-0.0.29-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bbd70af41cbe107910582b0b2353112b", "sha256": "a7c8a73db029e8d07cfb3cb319c1bc63ee8aa75f743ebfbfa63cce5f1f3b15dd" }, "downloads": -1, "filename": "ormantic-0.0.29.tar.gz", "has_sig": false, "md5_digest": "bbd70af41cbe107910582b0b2353112b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10307, "upload_time": "2019-06-29T12:47:58", "url": "https://files.pythonhosted.org/packages/cd/9a/549c7945692131a9af6739ae81a29ba8d1d1fc4a2ddefd7a43d5f33bd16e/ormantic-0.0.29.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c421729f173c3d633d2a80d83cb717ca", "sha256": "4a2888954166b8243a4eda5ba8ea311766e0a19469067e81f4d5c78d1003d71c" }, "downloads": -1, "filename": "ormantic-0.0.29-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c421729f173c3d633d2a80d83cb717ca", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10072, "upload_time": "2019-06-29T12:47:57", "url": "https://files.pythonhosted.org/packages/97/30/ee6afcbf776480cace733b831d372bad4a24a62e71fe62bb00007909681e/ormantic-0.0.29-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bbd70af41cbe107910582b0b2353112b", "sha256": "a7c8a73db029e8d07cfb3cb319c1bc63ee8aa75f743ebfbfa63cce5f1f3b15dd" }, "downloads": -1, "filename": "ormantic-0.0.29.tar.gz", "has_sig": false, "md5_digest": "bbd70af41cbe107910582b0b2353112b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10307, "upload_time": "2019-06-29T12:47:58", "url": "https://files.pythonhosted.org/packages/cd/9a/549c7945692131a9af6739ae81a29ba8d1d1fc4a2ddefd7a43d5f33bd16e/ormantic-0.0.29.tar.gz" } ] }