{ "info": { "author": "Tom Christie", "author_email": "tom@tomchristie.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": "# ORM\n\n

\n\n \"Build\n\n\n \"Coverage\"\n\n\n \"Package\n\n

\n\nThe `orm` package is an async ORM for Python, with support for Postgres,\nMySQL, and SQLite. ORM is built with:\n\n* [SQLAlchemy core][sqlalchemy-core] for query building.\n* [`databases`][databases] for cross-database async support.\n* [`typesystem`][typesystem] for data validation.\n\nBecause ORM is built on SQLAlchemy core, you can use Alembic to provide\ndatabase migrations.\n\n**ORM is still under development: We recommend pinning any dependencies with `orm~=0.1`**\n\n**Note**: Use `ipython` to try this from the console, since it supports `await`.\n\n```python\nimport databases\nimport orm\nimport sqlalchemy\n\ndatabase = databases.Database(\"sqlite:///db.sqlite\")\nmetadata = sqlalchemy.MetaData()\n\n\nclass Note(orm.Model):\n __tablename__ = \"notes\"\n __database__ = database\n __metadata__ = metadata\n\n id = orm.Integer(primary_key=True)\n text = orm.String(max_length=100)\n completed = orm.Boolean(default=False)\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\n# 'pk' always refers to the primary key\nnote = await Note.objects.get(pk=2)\nnote.pk # 2\n```\n\nORM supports loading and filtering across foreign keys...\n\n```python\nimport databases\nimport orm\nimport sqlalchemy\n\ndatabase = databases.Database(\"sqlite:///db.sqlite\")\nmetadata = sqlalchemy.MetaData()\n\n\nclass Album(orm.Model):\n __tablename__ = \"album\"\n __metadata__ = metadata\n __database__ = database\n\n id = orm.Integer(primary_key=True)\n name = orm.String(max_length=100)\n\n\nclass Track(orm.Model):\n __tablename__ = \"track\"\n __metadata__ = metadata\n __database__ = database\n\n id = orm.Integer(primary_key=True)\n album = orm.ForeignKey(Album)\n title = orm.String(max_length=100)\n position = orm.Integer()\n\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\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.\ntracks = Track.objects.filter(album__name__iexact=\"fantasies\")\nassert len(tracks) == 2\n\n# Limit a query\ntracks = await Track.objects.limit(1).all()\nassert len(tracks) == 1\n```\n\n## Data types\n\nThe following keyword arguments are supported on all field types.\n\n* `primary_key`\n* `allow_null`\n* `default`\n* `index`\n* `unique`\n\nAll fields are required unless one of the following is set:\n\n* `allow_null` - Creates a nullable column. Sets the default to `None`.\n* `allow_blank` - Allow empty strings to validate. Sets the default to `\"\"`.\n* `default` - Set a default value for the field.\n\nThe following column types are supported.\nSee TypeSystem for [type-specific validation keyword arguments][typesystem-fields].\n\n* `orm.String(max_length)`\n* `orm.Text()`\n* `orm.Boolean()`\n* `orm.Integer()`\n* `orm.Float()`\n* `orm.Date()`\n* `orm.Time()`\n* `orm.DateTime()`\n* `orm.JSON()`\n\n[sqlalchemy-core]: https://docs.sqlalchemy.org/en/latest/core/\n[databases]: https://github.com/encode/databases\n[typesystem]: https://github.com/encode/typesystem\n[typesystem-fields]: https://www.encode.io/typesystem/fields/", "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/encode/orm", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "orm", "package_url": "https://pypi.org/project/orm/", "platform": "", "project_url": "https://pypi.org/project/orm/", "project_urls": { "Homepage": "https://github.com/encode/orm" }, "release_url": "https://pypi.org/project/orm/0.1.5/", "requires_dist": null, "requires_python": "", "summary": "An async ORM.", "version": "0.1.5" }, "last_serial": 5535003, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "d1fd581b8b4ede9c0ef85a34246f9a20", "sha256": "b6312f516beba8a3083f0b9287fdfcbe158afcb0ec05364c37350d915969e770" }, "downloads": -1, "filename": "orm-0.0.1.tar.gz", "has_sig": false, "md5_digest": "d1fd581b8b4ede9c0ef85a34246f9a20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2339, "upload_time": "2019-02-12T16:49:20", "url": "https://files.pythonhosted.org/packages/b8/7d/ca8fb30319a693fa7631816920305820300e566ef2fae2698151398ae846/orm-0.0.1.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "d9a4c9a599c26de8018b22b7e7feaf15", "sha256": "3beaf2cafa1acfad30ce2f5df0e25f0ba3bc5650354099ee1561e4bdd4521109" }, "downloads": -1, "filename": "orm-0.1.0.tar.gz", "has_sig": false, "md5_digest": "d9a4c9a599c26de8018b22b7e7feaf15", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4962, "upload_time": "2019-03-15T13:35:29", "url": "https://files.pythonhosted.org/packages/a1/a9/da13b2b8debbbd7d91d866dcf009c341e9d62c765e2a4a45de6e94535bb7/orm-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "eecad806d82ba72e029b180e830c182c", "sha256": "e9b89616b0481795de4c3156ec864209327513a868918e3142d8875e8007f3d3" }, "downloads": -1, "filename": "orm-0.1.1.tar.gz", "has_sig": false, "md5_digest": "eecad806d82ba72e029b180e830c182c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6137, "upload_time": "2019-03-18T15:27:43", "url": "https://files.pythonhosted.org/packages/8e/55/adc67ba939e1dc69ea0dfb1d08e39ffab0ecc8c2a0ec2a0f8e1c49e562fa/orm-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "ff0dc410a42cddfc8828ee3563904fe0", "sha256": "821420861735d8687a24ca3588ee5def4ac5c5ecd36bca7210395c62e25d4f8e" }, "downloads": -1, "filename": "orm-0.1.2.tar.gz", "has_sig": false, "md5_digest": "ff0dc410a42cddfc8828ee3563904fe0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7543, "upload_time": "2019-03-18T17:17:23", "url": "https://files.pythonhosted.org/packages/c6/a6/4a867c58f4bcab01cf782f91a58f37b4a93f390aba89a7f1c3410f9454fe/orm-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "028227a59669d55baa17ae458faf9bd5", "sha256": "14e3a7f63f4718f5d4a93bedbde8a72d3fa151c8f7e1cff9893897562a7386b8" }, "downloads": -1, "filename": "orm-0.1.3.tar.gz", "has_sig": false, "md5_digest": "028227a59669d55baa17ae458faf9bd5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7745, "upload_time": "2019-03-29T09:37:55", "url": "https://files.pythonhosted.org/packages/5b/ab/a4be1088bbe570860d1150c8f5d764e4b927e5e8db158b58bc09fe4db0d3/orm-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "2f8ebb674ad3a528e6fab3b412d68c64", "sha256": "29e58d976a7d6162c0a5d197dd226ec9d25f03723ac11db64bea568d74ee9154" }, "downloads": -1, "filename": "orm-0.1.4.tar.gz", "has_sig": false, "md5_digest": "2f8ebb674ad3a528e6fab3b412d68c64", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7770, "upload_time": "2019-03-29T13:56:06", "url": "https://files.pythonhosted.org/packages/bb/01/2057afb9336eb530e9e707ee87ddf28644f971dee245aea0e96b9b5a8e99/orm-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "262ee4e61ce01f0803dcb4feb19674d9", "sha256": "37cb4757b670c1713f4e0d65874c5afe819acbd712abb9743c97e1d4b00d511c" }, "downloads": -1, "filename": "orm-0.1.5.tar.gz", "has_sig": false, "md5_digest": "262ee4e61ce01f0803dcb4feb19674d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8936, "upload_time": "2019-07-15T13:45:23", "url": "https://files.pythonhosted.org/packages/d3/69/d23f26fef966ed3b21b2a30207985e21fdbb1a449c72f59e49957d25c1e2/orm-0.1.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "262ee4e61ce01f0803dcb4feb19674d9", "sha256": "37cb4757b670c1713f4e0d65874c5afe819acbd712abb9743c97e1d4b00d511c" }, "downloads": -1, "filename": "orm-0.1.5.tar.gz", "has_sig": false, "md5_digest": "262ee4e61ce01f0803dcb4feb19674d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8936, "upload_time": "2019-07-15T13:45:23", "url": "https://files.pythonhosted.org/packages/d3/69/d23f26fef966ed3b21b2a30207985e21fdbb1a449c72f59e49957d25c1e2/orm-0.1.5.tar.gz" } ] }