{ "info": { "author": "Vimal Aravindashan", "author_email": "vimal.aravindashan@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.8", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "==============\nDjango Sharded\n==============\n\nDjango Sharded adds ShardedModel, related fields, querysets, managers and\na shard-aware database router to quickly get started with sharded databases.\n\nYou can start with one shard and add more shards later. A maximum of 255 shards are supported.\n\n`sharded.db.models` is a drop-in replacement for `django.db.models` to help avoid import clutter.\n\nAt the moment, this package has been designed and tested to work only with PostgreSQL.\n\nQuick start\n-----------\n\n1. Add `sharded` as the first entry to your `INSTALLED_APPS` setting::\n\n INSTALLED_APPS = [\n 'sharded',\n ...\n ]\n\n2. Run `python manage.py migrate` to add `sharded.Shard` model to `default` database\n\n3. [OPTIONAL] Set a value for `SHARDED_DB_PREFIX`. Default prefix is `shard\\_`::\n\n SHARDED_DB_PREFIX = 'shard_'\n\n4. Add `sharded.db.routers.ShardedRouter` to `DATABASE_ROUTERS` setting::\n\n DATABASE_ROUTERS = ['sharded.db.routers.ShardedRouter',]\n\n5. Setup all available shards::\n\n #NOTE: Django Sharded accesses each shard using the name format '%s%03d' % (SHARDED_DB_PREFIX, n)\n DATABASES['shard_001'] = {\n 'ENGINE': 'django.db.backends.postgresql_psycopg2',\n 'NAME': 'shard',\n 'USER': 'prjdbuser',\n 'PASSWORD': 'supersecretpassword',\n 'HOST': 'host.for.shard-001.com',\n 'PORT': '5432',\n }\n DATABASES['shard_002'] = {\n 'ENGINE': 'django.db.backends.postgresql_psycopg2',\n 'NAME': 'shard_002',\n 'USER': 'prjdbuser',\n 'PASSWORD': 'supersecretpassword',\n 'HOST': 'host.for.shard-002.com',\n 'PORT': '5432',\n }\n DATABASES['shard_003'] = {\n 'ENGINE': 'django.db.backends.postgresql_psycopg2',\n 'NAME': 'shard_003',\n 'USER': 'prjdbuser',\n 'PASSWORD': 'supersecretpassword',\n 'HOST': 'host.for.shard-002.com',\n 'PORT': '5432',\n }\n DATABASES['shard_004'] = {\n 'ENGINE': 'django.db.backends.postgresql_psycopg2',\n 'NAME': 'shard',\n 'USER': 'prjdbuser',\n 'PASSWORD': 'supersecretpassword',\n 'HOST': 'host.for.shard-004.com',\n 'PORT': '5432',\n }\n \n #NOTE: If you use 'dj-database-url' or 'django-connection-url' (shameless self-plug),\n # you can simplify the above using env vars like DATABASE_SHARD_nnn_URL\n import connection_url\n for shard in xrange(1,256):\n shard = '%s%03d' % ('shard_', shard) #TODO: Use SHARDED_DB_PREFIX if you've customized it above\n shard_env = 'DATABASE_' + shard.upper() + '_URL'\n if shard_env not in os.environ:\n break\n DATABASES.setdefault(shard, connection_url.config(shard_env))\n\n6. Run `python manage.py initshard <1..255>` with optional parameters to initialize the shard\n\n7. Run `python manage.py updateshard <1..255> --capacity ` to keep track of available capacity in the shard\n\n8. Use `ShardedModel` as base for models that require sharding. Related models will automatically be included in the same shard and the ForeignKey field will also automatically use a big integer column::\n\n from sharded.db import models\n from sharded.models import Shard\n \n class HelloManager(models.ShardedManager):\n use_for_related_fields = True\n \n def create(self, **kwargs):\n if not self._db:\n self._db = str(Shard.objects.most_free_shard())\n return super(HelloManager, self).create(**kwargs)\n\n class Hello(models.ShardedModel):\n a_random_field = models.IntegerField()\n \n objects = HelloManager()\n \n class Foo(models.Model):\n hello = models.ForeignKey(Hello)\n \n class Bar(models.Model):\n hello = models.OneToOneField(Hello)\n \n class Baz(models.ShardedModel):\n hello = models.ForeignKey(Hello)\n \n class Herp(models.Model): #Unsharded model\n derp = models.CharField(max_length=8)\n\n9. Run `python manage.py makemigrations` and then, `python manage.py migrate --all` to apply migrations across all shards\n\n10. Add a cronjob to run `python manage.py updateshard` to update shard usage levels at regular intervals", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/f0r4y312/django-sharded", "keywords": "django shards sharding sharded databases", "license": "Apache-2.0", "maintainer": null, "maintainer_email": null, "name": "django-sharded", "package_url": "https://pypi.org/project/django-sharded/", "platform": "any", "project_url": "https://pypi.org/project/django-sharded/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/f0r4y312/django-sharded" }, "release_url": "https://pypi.org/project/django-sharded/0.1.2/", "requires_dist": null, "requires_python": null, "summary": "Get started with sharded databases using ShardedModel, related fields, querysets, managers and a shard-aware database router.", "version": "0.1.2" }, "last_serial": 2471453, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "7719feaaf9240295620f147222640daa", "sha256": "f409aea8dbeb968ed5159ab41b50360b9885a3b25d66bbac0ebb3438376c1f4a" }, "downloads": -1, "filename": "django_sharded-0.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "7719feaaf9240295620f147222640daa", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 21485, "upload_time": "2016-11-18T20:43:21", "url": "https://files.pythonhosted.org/packages/e5/d5/6b3fad352d6fee066b77e8f332fab2d7a14b0cc02ff35f6192f40e129f65/django_sharded-0.1.0-py2-none-any.whl" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "0884d6bec08b041ed1245b2742b0899e", "sha256": "609c53d83260ffd33ae9ac3509a7297c25c25fef6bc01ac3669e063aea7a3db5" }, "downloads": -1, "filename": "django_sharded-0.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "0884d6bec08b041ed1245b2742b0899e", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 21534, "upload_time": "2016-11-18T20:59:54", "url": "https://files.pythonhosted.org/packages/60/a0/8265edc7caeeb1559ed27468bdf2a6d88a983f500a4449ec38dddd633beb/django_sharded-0.1.1-py2-none-any.whl" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "c9c94005b2174b18145789871c107bdf", "sha256": "861f466ce47dbd4b840b13dee00073d02409ca6d1bb976e8a201517db6ce776c" }, "downloads": -1, "filename": "django_sharded-0.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "c9c94005b2174b18145789871c107bdf", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 21545, "upload_time": "2016-11-20T09:09:28", "url": "https://files.pythonhosted.org/packages/4e/9f/e5b6fa73a509360364eb52d25d3d3fdab6b86a29812589f6bff7004ab4a9/django_sharded-0.1.2-py2-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c9c94005b2174b18145789871c107bdf", "sha256": "861f466ce47dbd4b840b13dee00073d02409ca6d1bb976e8a201517db6ce776c" }, "downloads": -1, "filename": "django_sharded-0.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "c9c94005b2174b18145789871c107bdf", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 21545, "upload_time": "2016-11-20T09:09:28", "url": "https://files.pythonhosted.org/packages/4e/9f/e5b6fa73a509360364eb52d25d3d3fdab6b86a29812589f6bff7004ab4a9/django_sharded-0.1.2-py2-none-any.whl" } ] }