{ "info": { "author": "Brian Cappello", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# SQLAlchemy Unchained\n\nEnhanced declarative models for SQLAlchemy.\n\n## Useful Links\n\n* [Read the Docs](https://sqlalchemy-unchained.readthedocs.io)\n* [GitHub](https://github.com/briancappello/sqlalchemy-unchained)\n* [PyPI](https://pypi.org/project/SQLAlchemy-Unchained/)\n\n## Usage\n\n### Installation\n\nRequires Python 3.6+, SQLAlchemy and Alembic (for migrations)\n\n```bash\n$ pip install sqlalchemy-unchained\n```\n\nAnd let's create a directory structure to work with:\n\n```bash\nmkdir your-project && cd your-project && \\\nmkdir your_package && mkdir db && \\\ntouch setup.py your_package/config.py your_package/db.py your_package/models.py\n```\n\nFrom now it is assumed that you are working from the `your-project` directory. All file paths at the top of code samples will be relative to this directory, and all commands should be run from this directory (unless otherwise noted).\n\n### Configure\n\n#### Using SQLite\n\n```python\n# your_package/config.py\n\nimport os\n\n\nclass Config:\n PROJECT_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))\n\n DATABASE_URI = 'sqlite:///' + os.path.join(PROJECT_ROOT, 'db', 'dev.sqlite')\n```\n\nHere we're creating an on-disk SQLite database at `project-root/db/dev.sqlite`.\n\n#### Using PostgreSQL or MariaDB/MySQL\n\nIf instead you'd like to use PostgreSQL or MariaDB/MySQL, now would be the time to configure it. For example, to use PostgreSQL with the ``psycopg2`` engine:\n\n```python\n# your_package/config.py\n\nimport os\n\n\nclass Config:\n DATABASE_URI = '{engine}://{user}:{pw}@{host}:{port}/{db}'.format(\n engine=os.getenv('SQLALCHEMY_DATABASE_ENGINE', 'postgresql+psycopg2'),\n user=os.getenv('SQLALCHEMY_DATABASE_USER', 'your_db_user'),\n pw=os.getenv('SQLALCHEMY_DATABASE_PASSWORD', 'your_db_user_password'),\n host=os.getenv('SQLALCHEMY_DATABASE_HOST', '127.0.0.1'),\n port=os.getenv('SQLALCHEMY_DATABASE_PORT', 5432),\n db=os.getenv('SQLALCHEMY_DATABASE_NAME', 'your_db_name'))\n```\n\nFor MariaDB/MySQL, replace the ``engine`` parameter with ``mysql+mysqldb`` and the ``port`` parameter with ``3306``.\n\nNote that you'll probably need to install the relevant driver package, eg:\n\n```bash\n# for postgresql+psycopg2\npip install --no-binary psycopg2\n\n# for mysql+mysqldb\npip install mysqlclient\n```\n\nSee the official documentation on [SQLAlchemy Dialects](https://docs.sqlalchemy.org/en/latest/dialects/) to learn more about connecting to other database engines.\n\n### Connect\n\n```python\n# your_package/db.py\n\nfrom sqlalchemy_unchained import *\n\nfrom .config import Config\n\n\nengine, Session, Model, relationship = init_sqlalchemy_unchained(Config.DATABASE_URI)\n```\n\nIf you need to customize the creation of any of these parameters, this is what `init_sqlalchemy_unchained` is doing behind the scenes:\n\n```python\n# your_package/db.py\n\nfrom sqlalchemy.orm import relationship as _relationship\nfrom sqlalchemy_unchained import *\nfrom sqlalchemy_unchained import _wrap_with_default_query_class\n\nfrom .config import Config\n\n\nengine = create_engine(Config.DATABASE_URI)\nSession = scoped_session_factory(bind=engine, query_cls=BaseQuery)\nSessionManager.set_session_factory(Session)\nModel = declarative_base(bind=engine)\nrelationship = _wrap_with_default_query_class(_relationship, BaseQuery)\n```\n\n### Create some models\n\n```python\n# your_package/models.py\n\nfrom . import db\n\n\nclass Parent(db.Model):\n name = db.Column(db.String, nullable=False)\n\n children = db.relationship('Child', back_populates='parent')\n\n\nclass Child(db.Model):\n name = db.Column(db.String, nullable=False)\n\n parent_id = db.foreign_key('Parent', nullable=False)\n parent = db.relationship('Parent', back_populates='children')\n```\n\nThis is the first bit that's really different from using stock SQLAlchemy. By default, models in SQLAlchemy Unchained automatically have their `__tablename__` configured, and include a primary key column `id` as well as the automatically-timestamped columns `created_at` and `updated_at`.\n\nThis is customizable. For example, if you wanted to rename the columns on `Parent` and disable timestamping on `Child`:\n\n```python\n# your_package/models.py\n\nfrom . import db\n\n\nclass Parent(db.Model):\n class Meta:\n pk = 'pk'\n created_at = 'created'\n updated_at = 'updated'\n\n name = db.Column(db.String, nullable=False)\n\n children = db.relationship('Child', back_populates='parent')\n\n\nclass Child(db.Model):\n class Meta:\n table = 'child' # explicitly set/customize the table name\n created_at = None\n updated_at = None\n\n name = db.Column(db.String, nullable=False)\n\n parent_id = db.foreign_key('Parent', nullable=False)\n parent = db.relationship('Parent', back_populates='children')\n```\n\nThe are other `Meta` options that SQLAlchemy Unchained supports, and we'll have a look at those in a bit. We'll also cover how to change the defaults for all models, as well as how to add support for your own custom `Meta` options. But for now, let's get migrations configured before we continue any further.\n\n### Configure database migrations\n\nInitialize Alembic:\n\n```bash\nalembic init db/migrations\n```\n\nNext, we need to configure Alembic to use the same database as we've already configured. This happens towards the top of the `db/migrations/env.py` file, which the `alembic init db/migrations` command generated for us. Modify the following lines:\n\n```python\nfrom your_package.config import Config\nfrom your_package.db import Model\nfrom your_package.models import *\n```\n\nFor these import statements to work, we need to install our package. Let's create a minimal `setup.py`:\n\n```python\n# setup.py\n\nfrom setuptools import setup, find_packages\n\n\nsetup(\n name='your-project',\n version='0.1.0',\n packages=find_packages(exclude=['docs', 'tests']),\n include_package_data=True,\n zip_safe=False,\n install_requires=[\n 'sqlalchemy-unchained==0.9.1',\n ],\n)\n```\n\nAnd install our package into the virtual environment you're using for development:\n\n```bash\npip install -e .\n```\n\nThat should be all that's required to get migrations working. Let's generate a migration for our models, and run it:\n\n```bash\nalembic revision --autogenerate -m 'create models'\n# verify the generated migration is going to do what you want, and then run it:\nalembic upgrade head\n```\n\n## Using SessionManager and Model Managers\n\nSQLAlchemy Unchained encourages embracing the design patterns recommended by the Data Mapper Pattern that SQLAlchemy uses. This means we use managers (or services, if you prefer) to handle all of our interactions with the database. SQLAlchemy Unchained includes two classes to facilitate making this as easy as possible: [SessionManager](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#sessionmanager) and [ModelManager](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#modelmanager). \n\n[SessionManager](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#sessionmanager) is a concrete class that you can and should use directly whenever you need to interact with the database session. [ModelManager](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#modelmanager) is an abstract subclass of [SessionManager](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#sessionmanager) that you should extend for each of the models in your application:\n\n```python\nfrom your_package import db\n\n\nclass YourModel(db.Model):\n name = db.Column(db.String, nullable=False)\n\n\nclass YourModelManager(db.ModelManager):\n class Meta:\n model = YourModel\n\n def create(self, name, commit=False, **kwargs) -> YourModel:\n return super().create(name=name, commit=commit, **kwargs)\n\n def find_by_name(self, name) -> Union[YourModel, None]:\n return self.get_by(name=name)\n\n\ninstance = YourModelManager().create(name='foobar', commit=True)\n```\n\nBoth [SessionManager](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#sessionmanager) and [ModelManager](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#modelmanager) are singletons, so whenever you call `SessionManager()` or `YourModelManager()`, you will always get the same instance.\n\n## Included Meta Options\n\n### table (`__tablename__`)\n\n```python\nclass Foo(db.Model):\n class Meta:\n table: str = 'foo'\n```\n\nSet to customize the name of the table in the database for the model. By default, we use the model's class name converted to snake case. \n\nNOTE: The snake case logic used is slightly different from that of Flask-SQLAlchemy, so if you're porting your models over and any of them have sequential upper-case letters, you will probably need to change the default.\n\n### pk (primary key column)\n\n```python\nclass Foo(db.Model):\n class Meta:\n pk: Union[str, None] = _ModelRegistry().default_primary_key_column = 'id'\n```\n\nSet to a string to customize the column name used for the primary key, or set to `None` to disable the column.\n\nNOTE: Customizing the default primary key column name used for all models is different from customizing the defaults for other meta options. (You should subclass `_ModelRegistry` and set its `default_primary_key_column` attribute. This is necessary for the `foreign_key` helper function to work correctly.)\n\n### created_at (row insertion timestamp)\n\n```python\nclass Foo(db.Model):\n class Meta:\n created_at: Union[str, None] = 'created_at' # 'created_at' is the default\n```\n\nSet to a string to customize the column name used for the creation timestamp, or set to `None` to disable the column.\n\n### updated_at (last updated timestamp)\n\n```python\nclass Foo(db.Model):\n class Meta:\n updated_at: Union[str, None] = 'updated_at' # 'updated_at' is the default\n```\n\nSet to a string to customize the column name used for the updated timestamp, or set to `None` to disable the column.\n\n### repr (automatic pretty `__repr__`)\n\n```python\nclass Foo(db.Model):\n class Meta:\n repr: Tuple[str, ...] = (_ModelRegistry.default_primary_key_column,) # default is ('id',)\n\nprint(Foo()) # prints: Foo(id=1)\n```\n\nSet to a tuple of column (attribute) names to customize the representation of models.\n\n### validation\n\n```python\nclass Foo(db.Model):\n class Meta:\n validation: bool = True # True is the default\n```\n\nSet to `False` to disable validation of model instances.\n\n### polymorphic (mapped model class hierarchies)\n\n```python\nclass Foo(db.Model):\n class Meta:\n polymorphic: Union[bool, str, None] = True # None is the default\n\n\nclass Bar(Foo):\n pass\n```\n\nThis meta option is disabled by default, and can be set to one of `'joined'`, `'single'`, or `True` (an alias for `'joined'`). See [the SQLAlchemy documentation on class inheritance hierarchies](https://docs.sqlalchemy.org/en/latest/orm/inheritance.html) for more info.\n\nWhen `polymorphic` is enabled, there are two other meta options available to further customize its behavior:\n\n```python\nclass Foo(db.Model):\n class Meta:\n polymorphic = True\n polymorphic_on: str = 'discriminator' # column name to store polymorphic_identity in\n polymorphic_identity: str = 'models.Foo' # unique identifier to use for this model\n\n\nclass Bar(Foo):\n class Meta:\n polymorphic_identity = 'models.Bar'\n```\n\n`polymorphic_identity` is the identifier used by SQLAlchemy to distinguish which model class a row should use, and defaults to using the model's class name. The `polymorphic_identity` gets stored in the `polymorphic_on` column, which defaults to `'discriminator'`.\n\n**IMPORTANT:** The `polymorphic` and `polymorphic_on` Meta options should be specified on the base model of the hierarchy *only*. Conversely if you want to customize `polymorphic_identity`, it should be specified on *every* model in the hierarchy.\n\n## Model Validation\n\nSQLAlchemy Unchained adds support for validating models before persisting them to the database. This is enabled by default, although you can disable it with the [validation](https://sqlalchemy-unchained.readthedocs.io/en/latest/readme.html#validation) Meta option.\n\nThere is one included validator: [Required](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#required). It can be used like so:\n\n ```python\nfrom your_package import db\n\n\nclass YourModel(db.Model):\n first_name = db.Column(db.String, info=dict(required=True))\n middle_name = db.Column(db.String, info=dict(required='a custom message'))\n last_name = db.Column(db.String, info=dict(validators=[db.Required]))\n suffix = db.Column(db.String, info=dict(validators=[db.Required('a custom message')]))\n```\n\nThere are two different ways you can write custom validation for your models.\n\nThe first is by extending [BaseValidator](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#basevalidator), implementing `__call__`, and raising [ValidationError](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#validationerror) if the validation fails:\n\n```python\nfrom your_package import db\n\n\nclass ValidateEmail(db.BaseValidator):\n def __call__(self, value):\n super().__call__(value)\n if '@' not in value: # not how you should actually verify email addresses\n raise db.ValidationError(self.msg or 'Invalid email address')\n\n\nclass YourModel(db.Model):\n email = db.Column(db.String, info=dict(validators=[ValidateEmail]))\n```\n\nThe second is by defining a validation `classmethod` or `staticmethod` directly on the model class:\n\n```python\nfrom your_package import db\n\n\nclass YourModel(db.Model):\n email = db.Column(db.String)\n\n @staticmethod\n def validate_email(value):\n if '@' not in value: # not how you should actually verify email addresses\n raise db.ValidationError('Invalid email address')\n```\n\nValidation methods defined on model classes must follow a specific naming convention: either `validate_` or `validates_` will work. Just like when implementing `__call__` on [BaseValidator](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#basevalidator), model validation methods should raise [ValidationError](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#validationerror) if their validation fails.\n\nValidation happens automatically whenever your create or update a model instance. If any of the validators fail, [ValidationErrors](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#validationerrors) will be raised.\n\n## Customizing Meta Options\n\nThe meta options available are configurable. Let's take a look at the implementation of the `created_at` meta option:\n\n```python\nimport sqlalchemy as sa\n\nfrom py_meta_utils import McsArgs\nfrom sqlalchemy import func as sa_func\nfrom sqlalchemy_unchained import ColumnMetaOption\n\n\nclass CreatedAtColumnMetaOption(ColumnMetaOption):\n def __init__(self, name='created_at', default='created_at', inherit=True):\n super().__init__(name=name, default=default, inherit=inherit)\n\n def get_column(self, mcs_args: McsArgs):\n return sa.Column(sa.DateTime, server_default=sa_func.now())\n```\n\nFor examples sake, let's say you wanted every model to have a required name column, but no automatic timestamping behavior. First we need to implement a [ColumnMetaOption](https://sqlalchemy-unchained.readthedocs.io/en/latest/api.html#columnmetaoption):\n\n```python\n# your_package/base_model.py\n\nimport sqlalchemy as sa\n\nfrom py_meta_utils import McsArgs\nfrom sqlalchemy_unchained import (BaseModel as _BaseModel, ColumnMetaOption, \n ModelMetaOptionsFactory)\n\nclass NameColumnMetaOption(ColumnMetaOption):\n def __init__(self):\n super().__init__('name', default='name', inherit=True)\n\n def get_column(self, mcs_args: McsArgs):\n return sa.Column(sa.String, nullable=False)\n\n\nclass CustomModelMetaOptionsFactory(ModelMetaOptionsFactory):\n _options = ModelMetaOptionsFactory._options + [NameColumnMetaOption]\n\n\nclass BaseModel(_BaseModel):\n _meta_options_factory_class = CustomModelMetaOptionsFactory\n\n class Meta:\n created_at = None\n updated_at = None\n```\n\nThe last step is to tell SQLAlchemy Unchained to use our customized `BaseModel` class:\n\n```python\n# your_package/db.py\n\nfrom sqlalchemy_unchained import *\n\nfrom .base_model import BaseModel\nfrom .config import Config\n\n\nengine, Session, Model, relationship = init_sqlalchemy_unchained(Config.DATABASE_URI, \n model=BaseModel)\n```\n\n## Customizing the Default Primary Key Column Name\n\nThe primary key column is special in that knowledge of its setting is required for determining foreign key column names during model class creation. The first step is to subclass the `_ModelRegistry` and set its `default_primary_key_column` class attribute:\n\n```python\n# your_package/model_registry.py\n\nfrom sqlalchemy_unchained import _ModelRegistry as BaseModelRegistry\n\n\nclass CustomModelRegistry(BaseModelRegistry):\n default_primary_key_column = 'pk'\n```\n\nAnd then, in order to inform SQLAlchemy Unchained about your customized model registry, you need call `_ModelRegistry.set_singleton_class`:\n\n```python\n# your_package/db.py\n\nfrom sqlalchemy_unchained import *\nfrom sqlalchemy_unchained import _ModelRegistry\n\nfrom .config import Config\nfrom .model_registry import CustomModelRegistry\n\n\n_ModelRegistry.set_singleton_class(CustomModelRegistry)\nengine, Session, Model, relationship = init_sqlalchemy_unchained(Config.DATABASE_URI)\n```\n\n## Lazy Mapping (experimental)\n\nLazy mapping is feature that this package introduces on top of SQLAlchemy. It's experimental and disabled by default. In stock SQLAlchemy, when you define a model, the second that code gets imported, the base model's metaclass will register the model with SQLAlchemy's mapper. 99% of the time this is what you want to happen, but if for some reason you *don't* want that behavior, then you have to enable lazy mapping. There are two components to enabling lazy mapping.\n\nThe first step is to customize the model registry:\n\n```python\n# your_package/model_registry.py\n\nfrom py_meta_utils import McsInitArgs\nfrom sqlalchemy_unchained import _ModelRegistry\n\n\nclass LazyModelRegistry(_ModelRegistry):\n enable_lazy_mapping = True\n\n def should_initialize(self, mcs_init_args: McsInitArgs) -> bool:\n pass # implement your custom logic for determining which models to register\n # with SQLAlchemy\n```\n\nAnd just like for customizing the primary key column, we need to inform `_ModelRegistry` of our subclass by calling `_ModelRegistry.set_singleton_class`:\n\n```python\n# your_package/db.py\n\nfrom sqlalchemy_unchained import *\nfrom sqlalchemy_unchained import _ModelRegistry\n\nfrom .config import Config\nfrom .model_registry import LazyModelRegistry\n\n\n_ModelRegistry.set_singleton_class(LazyModelRegistry)\nengine, Session, Model, relationship = init_sqlalchemy_unchained(Config.DATABASE_URI)\n```\n\nThe last step is to define your models like so:\n\n```python\nclass Foo(db.Model):\n class Meta:\n lazy_mapped = True\n```\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/briancappello/sqlalchemy-unchained", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "SQLAlchemy-Unchained", "package_url": "https://pypi.org/project/SQLAlchemy-Unchained/", "platform": "", "project_url": "https://pypi.org/project/SQLAlchemy-Unchained/", "project_urls": { "Homepage": "https://github.com/briancappello/sqlalchemy-unchained" }, "release_url": "https://pypi.org/project/SQLAlchemy-Unchained/0.9.1/", "requires_dist": [ "alembic (>=1.0.9)", "py-meta-utils (>=0.7.6)", "sqlalchemy (>=1.2.12)", "coverage ; extra == 'dev'", "pytest (>=5.0) ; extra == 'dev'", "tox ; extra == 'dev'", "m2r ; extra == 'docs'", "sphinx ; extra == 'docs'", "sphinx-autobuild ; extra == 'docs'", "sphinx-rtd-theme ; extra == 'docs'" ], "requires_python": ">=3.6", "summary": "Improved declarative SQLAlchemy models", "version": "0.9.1" }, "last_serial": 5908353, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "a515f85624e522b44af7d00f7bbbd21b", "sha256": "31a87a46385e4e11f4b99342356bed7dd051d57d0810ebdb015f9cb3ab3c3910" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a515f85624e522b44af7d00f7bbbd21b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 13962, "upload_time": "2018-09-25T00:07:54", "url": "https://files.pythonhosted.org/packages/32/39/ca3551223a6a4034efeca68df197ae0b466affb5236cfec3ca471c56b4af/SQLAlchemy_Unchained-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "17b20f442ec080050aa43dc327aae60c", "sha256": "9495f93fdcfc4e9d1f0a424e72f1a6bb79576a148b06d95836bca2058addc32b" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.1.0.tar.gz", "has_sig": false, "md5_digest": "17b20f442ec080050aa43dc327aae60c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 11662, "upload_time": "2018-09-25T00:07:56", "url": "https://files.pythonhosted.org/packages/c2/a8/bb7ad0468d90bd58d34b8a9c761c6a9354cdb69bc23bab74342bbf1dfa02/SQLAlchemy%20Unchained-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "2ffe3ebaeea3c10910bbdce6b4310391", "sha256": "8454a37a15f25fc0b222748726e86a9824b121ad6b59395b7dfedaa428b94bb9" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2ffe3ebaeea3c10910bbdce6b4310391", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20474, "upload_time": "2018-09-26T22:21:55", "url": "https://files.pythonhosted.org/packages/d5/b4/c2d476eefe3ca9738fe247b8624d8bb06dbc19f3fed30a623b10ed73004a/SQLAlchemy_Unchained-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "12e2bccfb541e0d81e49eb0299d0cc48", "sha256": "e9f6eb15497e4b1b584ac347177e90c3336a490a8de2a9d353d933a9b87aed41" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.2.0.tar.gz", "has_sig": false, "md5_digest": "12e2bccfb541e0d81e49eb0299d0cc48", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18421, "upload_time": "2018-09-26T22:21:57", "url": "https://files.pythonhosted.org/packages/c5/65/c721997b0877a7e9a883cb7832d5c5b414d0fc91c429d6db28db386cefaa/SQLAlchemy%20Unchained-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "e646c5a12064be6bbf0ceb9a42559827", "sha256": "0844db8e8ed19533ef203eb3a6808f9226b4f00ae092b517321204a9ba98ecdf" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e646c5a12064be6bbf0ceb9a42559827", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20489, "upload_time": "2018-09-27T01:27:33", "url": "https://files.pythonhosted.org/packages/ce/f2/aa4a543313700be48c984cea83ba9870feacbe151d9e8ac98d5f6649f4ea/SQLAlchemy_Unchained-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "42745f31620db0e15b7348dc15ae6b08", "sha256": "dd1b01e6c0a7b005e11f68e9ef74b474dc8c3009e1244dd07d12378b943204c5" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.2.1.tar.gz", "has_sig": false, "md5_digest": "42745f31620db0e15b7348dc15ae6b08", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18463, "upload_time": "2018-09-27T01:27:34", "url": "https://files.pythonhosted.org/packages/d9/0a/bd7065be349218fb7a448b156d322259976af42134982d17ad117c14bc9f/SQLAlchemy%20Unchained-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "54790e2ba58e03fcdd7979d1165d6403", "sha256": "81768167ccec28e016c58b48bf7a2c004b14ca392673d5c3b3196a4c4d712661" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "54790e2ba58e03fcdd7979d1165d6403", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20478, "upload_time": "2018-09-29T22:06:34", "url": "https://files.pythonhosted.org/packages/71/70/83d442b77afa51fa6a9a7d324a26fa8dfefd88398c6bb1cadbed8d4524d7/SQLAlchemy_Unchained-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b0555f6e8ee0eb1ba839ebf90f87ef9e", "sha256": "63a054a583b32b4abf98a03bb4418011824ac00a239edb46991378b9555d2ed2" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.2.2.tar.gz", "has_sig": false, "md5_digest": "b0555f6e8ee0eb1ba839ebf90f87ef9e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18474, "upload_time": "2018-09-29T22:06:35", "url": "https://files.pythonhosted.org/packages/88/71/7c3e70956cac81e9cdea72a898894f0c989b92623ca23a5bbd253c2b2106/SQLAlchemy%20Unchained-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "716cd806df77b7146274509de06fc790", "sha256": "f97a30c6b710e906e6982673633f61898e2fa3604b7a2b7ec94001727bc0d045" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "716cd806df77b7146274509de06fc790", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 20513, "upload_time": "2018-10-01T01:17:22", "url": "https://files.pythonhosted.org/packages/ac/d4/9ac8f6df8df6788d7c2aec98abd465206d0c0a07ab6b4d070881b0a48abf/SQLAlchemy_Unchained-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5ded3cb9ab4fb7a12a36c8d6eb901d16", "sha256": "a24a9d30eeafd97a1afeed3342de79e16b110a7c284f0f8e98f52d6a4d55933b" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.3.0.tar.gz", "has_sig": false, "md5_digest": "5ded3cb9ab4fb7a12a36c8d6eb901d16", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 18520, "upload_time": "2018-10-01T01:17:23", "url": "https://files.pythonhosted.org/packages/9f/d4/944f8e366db1631b31323ab2a43cbc0f4360fb21f79c398032329a8b818d/SQLAlchemy%20Unchained-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "c4182ef0b2d52b90cd4dc8720c0307aa", "sha256": "689598765dcee44f522873d95f7d5f0e74b69fdb8dd8fc003148067c8159790b" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c4182ef0b2d52b90cd4dc8720c0307aa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 21041, "upload_time": "2018-10-04T20:32:19", "url": "https://files.pythonhosted.org/packages/55/78/d1653afebc01e12a243d498fa3edcbbf653754288ab03d86ae35a358b4fa/SQLAlchemy_Unchained-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c4873766120354ef492fabe537e130b", "sha256": "4ccac59af5ed5d6bfa704dc83385613f2fdbe1806cbcbe7613113f21c151eca7" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.3.1.tar.gz", "has_sig": false, "md5_digest": "5c4873766120354ef492fabe537e130b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19155, "upload_time": "2018-10-04T20:32:20", "url": "https://files.pythonhosted.org/packages/ef/a6/ff4ecf6fbcc7aab59894b5a54760a01d198a1a4de2958e2a040a57a01292/SQLAlchemy%20Unchained-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "8bcf32f4c02190d10ba6d4e2bc448373", "sha256": "7bc657fef8d1a894de9580c715b5693a9f1fa699b8463e910c4616eb2ffe98ae" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8bcf32f4c02190d10ba6d4e2bc448373", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 21055, "upload_time": "2018-10-09T17:51:02", "url": "https://files.pythonhosted.org/packages/ac/0f/c9ce281707df6d55762c018ed20f696a7487ab5a54e7127e0f71724c25d3/SQLAlchemy_Unchained-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d7b23d2d94e63b7da64494fd22244b8b", "sha256": "27fe922f2ed3346de961aad9662c02537075c08020a83236e1443d622125c4b5" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.4.0.tar.gz", "has_sig": false, "md5_digest": "d7b23d2d94e63b7da64494fd22244b8b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19184, "upload_time": "2018-10-09T17:51:03", "url": "https://files.pythonhosted.org/packages/65/66/18db1d5fbb9ad76645fc87c84bdb9abc627ae69d0ca443437474ddc7ab19/SQLAlchemy%20Unchained-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "d23979c8545e9f9afe7c9138e4a30d0e", "sha256": "d1df17c7ea0527573afb925c65ed1d8ce40134469061968b8dd27c67f9282154" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d23979c8545e9f9afe7c9138e4a30d0e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 21358, "upload_time": "2018-10-16T23:25:46", "url": "https://files.pythonhosted.org/packages/12/35/9a037b94b3542826142100c5dc4c7ae49c2e869df0f34aaf4413f8dc404a/SQLAlchemy_Unchained-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "61f03d5b9dc81e5e626f51f0ac78a551", "sha256": "3e449032f1206e0adbc4d573ef795d26eb755eedacb4d2337764a1e677c5ade2" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.5.0.tar.gz", "has_sig": false, "md5_digest": "61f03d5b9dc81e5e626f51f0ac78a551", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 19716, "upload_time": "2018-10-16T23:25:47", "url": "https://files.pythonhosted.org/packages/87/0f/6621d65b0b761f97cddd70c0a2be303170cb96464866f66f83b307cfb938/SQLAlchemy%20Unchained-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "613600b238419ea05073097dae70d58c", "sha256": "c6c52cd71f46ebc974d198adf03215f43b1fe1aaa055c5ead391bd3a8c062528" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "613600b238419ea05073097dae70d58c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 21491, "upload_time": "2018-10-20T21:12:07", "url": "https://files.pythonhosted.org/packages/b8/31/497eb091c8c24faafe1e6044afdb9df3f0da2f17899a1dbb8a1e64d31d3f/SQLAlchemy_Unchained-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a5648f639a961f355539a9185171760e", "sha256": "163e00311e077a8e224cecf0952bcfeb1326b7af5c2c5f741222cbddc60550eb" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.5.1.tar.gz", "has_sig": false, "md5_digest": "a5648f639a961f355539a9185171760e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 19877, "upload_time": "2018-10-20T21:12:09", "url": "https://files.pythonhosted.org/packages/0d/f7/709f1425f611e089d1d9593edd40faed80d88e424d3fee3517536da51b37/SQLAlchemy%20Unchained-0.5.1.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "191b5e833df7a935912f73364a84e8d2", "sha256": "ff9d7b1f7e7b1465a89d0f5a82196efc5db2d109e8d9c5e8cc3f916dae57f2f9" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "191b5e833df7a935912f73364a84e8d2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 28295, "upload_time": "2018-10-23T08:04:21", "url": "https://files.pythonhosted.org/packages/09/ff/9d11c1a09b9a6c971d7e44b1517fb01fdcdb23875973db8e8f9b0d4abdfc/SQLAlchemy_Unchained-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8331043dc35e3f80cd288b782787ec62", "sha256": "a30c165c8b41e8931ba882b399d3840a162b420f03b0094c0b90cdb7aad7353a" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.0.tar.gz", "has_sig": false, "md5_digest": "8331043dc35e3f80cd288b782787ec62", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27226, "upload_time": "2018-10-23T08:04:23", "url": "https://files.pythonhosted.org/packages/bf/f4/ddf416592804e43d9ac2207be60c6e7d871561a60e7b3fbe100dc5f81e55/SQLAlchemy%20Unchained-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "d65593e571271ff4c8d7c0bca866f4bf", "sha256": "4a858795f3520f4d59c34fbf101de79b82e09dd07d8fbd4bf760e5878a4ae2ac" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d65593e571271ff4c8d7c0bca866f4bf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 28288, "upload_time": "2018-10-23T08:42:19", "url": "https://files.pythonhosted.org/packages/df/1f/3cf544bb39c670da2ad45a9d09d23bc5785d3006eb41787b8d507324d4ef/SQLAlchemy_Unchained-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "203cf01a34b3be775c614c11667efac0", "sha256": "6d42aa620c344f86dae3c58e2a587efe47537567bd661c6e926e46eaccd88c88" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.1.tar.gz", "has_sig": false, "md5_digest": "203cf01a34b3be775c614c11667efac0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27233, "upload_time": "2018-10-23T08:42:21", "url": "https://files.pythonhosted.org/packages/44/23/3db41152e5d9b013b8232da6d149cec63d185c0b3518c4d459c032a690e3/SQLAlchemy%20Unchained-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "4d99dc497eab0ec85eba03e8f068e7be", "sha256": "1cf646522b1decb4b2a8cfe9c3b59bb0255e8c182019ba576f40527184952244" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4d99dc497eab0ec85eba03e8f068e7be", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 28367, "upload_time": "2018-10-26T23:15:51", "url": "https://files.pythonhosted.org/packages/70/d2/29d485d5f7eee1b7b7d2504e0ac89b394c1aa036d478d8dee6ef42644478/SQLAlchemy_Unchained-0.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56124491d0617445ac4f15235b88327f", "sha256": "902bd6e822799a4fc53d0e1aa1e1ece3570e7f8c3722f0e953e617f672fdce45" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.2.tar.gz", "has_sig": false, "md5_digest": "56124491d0617445ac4f15235b88327f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27380, "upload_time": "2018-10-26T23:15:53", "url": "https://files.pythonhosted.org/packages/65/73/333554fa8f8f48a5f097c7b8fa9f63aeb8184391c1aa8d046614659b917a/SQLAlchemy%20Unchained-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "a8ba7b27eca0b9ce68fa74afabb564fa", "sha256": "9a392d0dcfa67f1708af8c4a3578d7e7298a7f6500ee30d336740dbe68af273d" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.3-py3-none-any.whl", "has_sig": false, "md5_digest": "a8ba7b27eca0b9ce68fa74afabb564fa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 28425, "upload_time": "2018-10-28T07:15:27", "url": "https://files.pythonhosted.org/packages/b3/b6/3298636c49688e3d497d0ae2136debf24e7c42acafe7e8d2b722c1962b9d/SQLAlchemy_Unchained-0.6.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "090bb71c9a319e632ab81b4a58f32afa", "sha256": "4f047a0ef6dc36cf164cc2cec67d0c2803f532e608e6569df9ec36e0cb4558e3" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.3.tar.gz", "has_sig": false, "md5_digest": "090bb71c9a319e632ab81b4a58f32afa", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27501, "upload_time": "2018-10-28T07:15:29", "url": "https://files.pythonhosted.org/packages/e6/7a/8703eee07d27a6e2eb277a884cc9c6e6ffffc4ff8d6f64564addf453fdab/SQLAlchemy%20Unchained-0.6.3.tar.gz" } ], "0.6.4": [ { "comment_text": "", "digests": { "md5": "3eb2c36725e3a6c0dcfdd5b616b47b4d", "sha256": "500368e81639d5c68ee5bc8d0eeae4f671af94194f96d311fa83f835b31f8cd2" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.4-py3-none-any.whl", "has_sig": false, "md5_digest": "3eb2c36725e3a6c0dcfdd5b616b47b4d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 28366, "upload_time": "2018-10-28T10:57:54", "url": "https://files.pythonhosted.org/packages/d3/79/fbd3261493529fdc9bd0f6351abf6c75d9458a3f3655f5150850e2b169b9/SQLAlchemy_Unchained-0.6.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7e268100f9397f7053deb11a78e627ea", "sha256": "a09228b0ad162fb2f97bf6e0781fe170baa3965094dafc2f8c203b7b88aaf133" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.4.tar.gz", "has_sig": false, "md5_digest": "7e268100f9397f7053deb11a78e627ea", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27492, "upload_time": "2018-10-28T10:57:55", "url": "https://files.pythonhosted.org/packages/36/dd/dca64bb1427ce9630ce5b2b153d2f0ce74e67c16d57cd87bc43d1603e9c9/SQLAlchemy%20Unchained-0.6.4.tar.gz" } ], "0.6.5": [ { "comment_text": "", "digests": { "md5": "c4e7288eb43c1ca8044a6d78a18b7f3e", "sha256": "8ac5b20b77ae001eaa6cb7d584dae4298e6ff79dd4f56c752df6b09c0e7b027e" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.5-py3-none-any.whl", "has_sig": false, "md5_digest": "c4e7288eb43c1ca8044a6d78a18b7f3e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 28406, "upload_time": "2018-10-28T19:31:03", "url": "https://files.pythonhosted.org/packages/c5/b7/8ed11119368fc3503970ec25744172bb369fe8cfbce5be63ee6b36fc09a3/SQLAlchemy_Unchained-0.6.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d94dd57535a231dc2e980efc1a90dd76", "sha256": "f19f2ad62d1eba82bd2f7cdb46d448904c2b4d6c4f6c8b138b834994ed3491bf" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.5.tar.gz", "has_sig": false, "md5_digest": "d94dd57535a231dc2e980efc1a90dd76", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27601, "upload_time": "2018-10-28T19:31:04", "url": "https://files.pythonhosted.org/packages/28/e4/8ece663a55b5ca02c1e0fe17c1c18ee0972d6c7b1385e0285a2393bc0668/SQLAlchemy%20Unchained-0.6.5.tar.gz" } ], "0.6.6": [ { "comment_text": "", "digests": { "md5": "9a0f3142e03eaf86a0ebb1df1f7856ed", "sha256": "4a6b2f701d913fa28f483d3176988063269ad9a2bc4be81e39d2fd3794f1e730" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.6-py3-none-any.whl", "has_sig": false, "md5_digest": "9a0f3142e03eaf86a0ebb1df1f7856ed", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 28409, "upload_time": "2018-10-28T23:55:34", "url": "https://files.pythonhosted.org/packages/d3/04/3f980e5b3a362cc6150b9c03a49de2b444c82b17b3fa824e053a454d953b/SQLAlchemy_Unchained-0.6.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a44b24fb2fa63df14cdf811f994693e3", "sha256": "1c5dbc7024dfae5eec27d01d0d2d943089e73d353c4345a909dcacd93eac70ac" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.6.tar.gz", "has_sig": false, "md5_digest": "a44b24fb2fa63df14cdf811f994693e3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27619, "upload_time": "2018-10-28T23:55:35", "url": "https://files.pythonhosted.org/packages/90/0b/e44ed25687077f9a3c6568dd81efa47bc7e6083e6490febc67e27b46b75c/SQLAlchemy%20Unchained-0.6.6.tar.gz" } ], "0.6.7": [ { "comment_text": "", "digests": { "md5": "097263e26829033b0a71be52673f8201", "sha256": "4d93dec7ca8d0d18903118346d9c32103938842003c6dc5d607eb0fb349b4f33" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.7-py3-none-any.whl", "has_sig": false, "md5_digest": "097263e26829033b0a71be52673f8201", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 28479, "upload_time": "2018-11-03T14:08:17", "url": "https://files.pythonhosted.org/packages/56/a2/62d31603043b9dacce1f14313cf657555e7c3cc70569206ef0632d3162aa/SQLAlchemy_Unchained-0.6.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4d406b02c5646a1a0bef5f3d5a9e9946", "sha256": "aeaf3b2fc8589072c2e51c03cdb67d413aa94bcc8ff4ec3c5b35568e88fbe724" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.7.tar.gz", "has_sig": false, "md5_digest": "4d406b02c5646a1a0bef5f3d5a9e9946", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 27744, "upload_time": "2018-11-03T14:08:19", "url": "https://files.pythonhosted.org/packages/d5/17/ac6bc6ca59212dff55fcd282fdf484240166668b908b2ae49234dcf49aa9/SQLAlchemy%20Unchained-0.6.7.tar.gz" } ], "0.6.8": [ { "comment_text": "", "digests": { "md5": "0b6fed8ff601d9f60069d10d64adc53b", "sha256": "7b5d6fd366ebf56d3f0d09bc8445f86efbf5556d041601d2f8f7d4429266456d" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.8-py3-none-any.whl", "has_sig": false, "md5_digest": "0b6fed8ff601d9f60069d10d64adc53b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 29951, "upload_time": "2018-11-07T17:42:38", "url": "https://files.pythonhosted.org/packages/0f/21/ce0cfb442b407649ab23f308e1f26e636975e8140286ab4ee23066db30b6/SQLAlchemy_Unchained-0.6.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3dcdeef6c180cdb9051e4d978cf2c6e2", "sha256": "16b540a11e1685849553606d716a02d912c4c9056917f9148d2a8060673c68fe" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.8.tar.gz", "has_sig": false, "md5_digest": "3dcdeef6c180cdb9051e4d978cf2c6e2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28374, "upload_time": "2018-11-07T17:42:39", "url": "https://files.pythonhosted.org/packages/ab/c7/c823bb918a65c1cf70c816fddb50b08b84f8b61834eb98fd2802b0fdc8c1/SQLAlchemy%20Unchained-0.6.8.tar.gz" } ], "0.6.9": [ { "comment_text": "", "digests": { "md5": "ae825f69632949c1ceb76d17b58f1b4b", "sha256": "7432586d4e96f0f9ab9bf8c34caf0992b47aa9caf66a689a53c1a3e150db2de3" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.6.9-py3-none-any.whl", "has_sig": false, "md5_digest": "ae825f69632949c1ceb76d17b58f1b4b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 30059, "upload_time": "2018-12-02T00:14:27", "url": "https://files.pythonhosted.org/packages/7b/35/d87ba78d2a59410e09643224ba47fd48bf970e668adb83aaeb8b4be6581e/SQLAlchemy_Unchained-0.6.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f4ab995e23a6e0ef062fe52863ad197a", "sha256": "8fba2928bbcec49b4e26b30a93345c097b269fbd2db62c7d338255aa2fd964bd" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.6.9.tar.gz", "has_sig": false, "md5_digest": "f4ab995e23a6e0ef062fe52863ad197a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28531, "upload_time": "2018-12-02T00:14:29", "url": "https://files.pythonhosted.org/packages/e6/ac/d872a7363b6f8718b30651574d665953b31a21877ea8ac9a63f0a9c25f3e/SQLAlchemy%20Unchained-0.6.9.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "7850d52946a778ad72ad48685a61834e", "sha256": "189bcd081c0f8a57c8c470314a479e494a02f101ef99c763e8369c65c3799b72" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7850d52946a778ad72ad48685a61834e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 30153, "upload_time": "2018-12-17T01:50:19", "url": "https://files.pythonhosted.org/packages/98/05/6bc8eee927c182d1279ad67722be2bf57e1b417c5852fa452ce021f1a106/SQLAlchemy_Unchained-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2506fe947865a48c3c9cf404f906883e", "sha256": "83c9555de8bfa3dd1e7b2b3e6f3ae2f7e54ac4f539296258ddaa603c1f8abf55" }, "downloads": -1, "filename": "SQLAlchemy Unchained-0.7.0.tar.gz", "has_sig": false, "md5_digest": "2506fe947865a48c3c9cf404f906883e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28679, "upload_time": "2018-12-17T01:50:21", "url": "https://files.pythonhosted.org/packages/38/7f/318a4c6b482d8f00241f383a5b961b40c90fce7c0e0eb61d66bd68e8a8c7/SQLAlchemy%20Unchained-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "cfb8d2c0666031a70e4e20f73a41ce2d", "sha256": "4555fe0b8849e29def719f346d582572159bde4f7cd8fc3f2a45646a25d75b56" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "cfb8d2c0666031a70e4e20f73a41ce2d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 30179, "upload_time": "2019-02-26T05:21:46", "url": "https://files.pythonhosted.org/packages/48/4e/1a2ac2848aa2b2a0564621a9a75d8ad32bc7819a598effdbd57946e936fc/SQLAlchemy_Unchained-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a755d453c079a9fccf0b0010eb97e6bc", "sha256": "c7329e5c85f2863af2b7c759c6ca2be300bc60b69c5da033e3ece341d01ba646" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.7.1.tar.gz", "has_sig": false, "md5_digest": "a755d453c079a9fccf0b0010eb97e6bc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28743, "upload_time": "2019-02-26T05:21:48", "url": "https://files.pythonhosted.org/packages/16/96/fe1c77bece3c8ccdab87743737ddab9e0e7fb2af653f948ffc3c5c96c16e/SQLAlchemy-Unchained-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "d873a7c5f190a2029c8f2761529ea466", "sha256": "7ee8e934ed1443dd1920fa6b2f50b801f14cb8db51ef42b4703b289fb90d8b3c" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d873a7c5f190a2029c8f2761529ea466", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 31080, "upload_time": "2019-04-11T18:08:52", "url": "https://files.pythonhosted.org/packages/d9/3c/8b93812b5fbd7ace2fa156465aefc481440d927ffd6007b03c995dfa0b98/SQLAlchemy_Unchained-0.7.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f88bb1dc6e435972b4d1eb4fe1bb8023", "sha256": "923c75cb036a913fb38cdf4b9f38b11117c29d85563d69250c84e0b85255c941" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.7.2.tar.gz", "has_sig": false, "md5_digest": "f88bb1dc6e435972b4d1eb4fe1bb8023", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28694, "upload_time": "2019-04-11T18:08:54", "url": "https://files.pythonhosted.org/packages/d0/ef/1f407809eb4794d9c3b295214dc7399aa700e28f489ac2da431e6d0e773d/SQLAlchemy-Unchained-0.7.2.tar.gz" } ], "0.7.4": [ { "comment_text": "", "digests": { "md5": "85a485f4d2ac8f45ace9dbf74335508a", "sha256": "9607b5381695818299b6408f36c46929c357a66772dee83a4c36ebccc259d864" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.7.4-py3-none-any.whl", "has_sig": false, "md5_digest": "85a485f4d2ac8f45ace9dbf74335508a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 31083, "upload_time": "2019-04-21T17:54:16", "url": "https://files.pythonhosted.org/packages/b4/66/dbdfdaad6a187bdae888dbfb017799f8c4eb87f89cf3df65880dd8974a15/SQLAlchemy_Unchained-0.7.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8e1c019ee5554a3dc269526dfd9c905f", "sha256": "5caedaba123fe68c25217f43bfa2c543c1e8f45060b1edcf74e7d571545ab59d" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.7.4.tar.gz", "has_sig": false, "md5_digest": "8e1c019ee5554a3dc269526dfd9c905f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28753, "upload_time": "2019-04-21T17:54:18", "url": "https://files.pythonhosted.org/packages/e9/2d/d8bc2d86f9f06829a2fdc72447d0d648667321de0d3609098518b2c97c78/SQLAlchemy-Unchained-0.7.4.tar.gz" } ], "0.7.5": [ { "comment_text": "", "digests": { "md5": "7809c486dfbb550f53d30c3f1c7dd1d7", "sha256": "72694bd61c1cb36d59ffe65491d93181870445ffb1e3f7b16e21bdf4dc70f0a8" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.7.5-py3-none-any.whl", "has_sig": false, "md5_digest": "7809c486dfbb550f53d30c3f1c7dd1d7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 31077, "upload_time": "2019-05-20T01:17:38", "url": "https://files.pythonhosted.org/packages/70/a4/91dcd3935279591b8d5e8621606c6f80a8e48b322d8f3097acbf78945ad1/SQLAlchemy_Unchained-0.7.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fd3a5b1a67dd5f4dc2f29b1f1edf6aa1", "sha256": "0832d22c35171ce0c0c8fba4c88368915493b552fb7fe807f2d063ec98a14aa9" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.7.5.tar.gz", "has_sig": false, "md5_digest": "fd3a5b1a67dd5f4dc2f29b1f1edf6aa1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 28803, "upload_time": "2019-05-20T01:17:41", "url": "https://files.pythonhosted.org/packages/12/5d/31f2afd72ee303c788505e770e42843c48251658131ce0eab9131cb9b9bc/SQLAlchemy-Unchained-0.7.5.tar.gz" } ], "0.7.6": [ { "comment_text": "", "digests": { "md5": "cffd5543349e44fcec33519b9be1f477", "sha256": "13bd31be8be931c99cc86b802a1c96ade5127f44faf448b6c2773fe2822c49c8" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.7.6-py3-none-any.whl", "has_sig": false, "md5_digest": "cffd5543349e44fcec33519b9be1f477", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 31108, "upload_time": "2019-05-20T01:54:33", "url": "https://files.pythonhosted.org/packages/fa/14/ba245a1b0ddae0f2b2eb15403f054ca162ed0a7218c313a5124dbc580ce6/SQLAlchemy_Unchained-0.7.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "26df3a6c88a0f9390789a0b7adc01ec8", "sha256": "e916817c4f25efd135b60a838a87cc32ea9a1e969575644ba30e618e8c43542b" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.7.6.tar.gz", "has_sig": false, "md5_digest": "26df3a6c88a0f9390789a0b7adc01ec8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 29332, "upload_time": "2019-05-20T01:54:36", "url": "https://files.pythonhosted.org/packages/0f/20/82dd4c4f301af3a50a780c87aeea3c2b3edd814f1b87a65f049b8e1a20ed/SQLAlchemy-Unchained-0.7.6.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "ccdb5fb6afd2c1e3b283e5b3a4574152", "sha256": "bb9ddfccfa6daf7ca5fc566202e737a6b0d0044b5909591bbbabd13fb86a1c10" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ccdb5fb6afd2c1e3b283e5b3a4574152", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 31150, "upload_time": "2019-09-11T02:01:42", "url": "https://files.pythonhosted.org/packages/a9/ae/e3c59fe753cb48bdf7c2c648ad6387065426660e37e74b33acc9e7a52798/SQLAlchemy_Unchained-0.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7a3455a7cd4848d6e123c43115768896", "sha256": "5e298e74bdbe0d732b4ec89c2ff67887a6e09990e3afab5f32d3e53ab18280b7" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.8.0.tar.gz", "has_sig": false, "md5_digest": "7a3455a7cd4848d6e123c43115768896", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 29947, "upload_time": "2019-09-11T02:01:45", "url": "https://files.pythonhosted.org/packages/25/e9/2dd59420e2d8eea8d3ed4edfa4e68aa22e4bf3e6096567dfd2556343eebc/SQLAlchemy-Unchained-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "b8ec999f0783ff0a1c9880854bc9a789", "sha256": "f3000e6db4d0536c630bf52f438232b3b330e2112e0bffb556b4660a285690dd" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b8ec999f0783ff0a1c9880854bc9a789", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 31570, "upload_time": "2019-09-30T18:21:20", "url": "https://files.pythonhosted.org/packages/08/56/4fe7481543d8b378f644a2f499f28c26cbb495772aff8138d2615ed337ca/SQLAlchemy_Unchained-0.9.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e762560e67c12946983a77341ed9f1f8", "sha256": "a8a813761814993926d248f7b42d06193d58685834ac5c0980b61e9f6c3780de" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.9.0.tar.gz", "has_sig": false, "md5_digest": "e762560e67c12946983a77341ed9f1f8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 30359, "upload_time": "2019-09-30T18:21:22", "url": "https://files.pythonhosted.org/packages/50/47/5ef0f38e8764fdf4f298623664d997c63b2f744aa573176c2c29555f169e/SQLAlchemy-Unchained-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "892a4e579d3fc278609ea6d83d1b03b3", "sha256": "3e6c31d127a8f14e3b1ca25ea0c0293d00c26c8f49f5b532aad4657a8915cc38" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "892a4e579d3fc278609ea6d83d1b03b3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 31570, "upload_time": "2019-09-30T18:33:07", "url": "https://files.pythonhosted.org/packages/92/7c/87fc27e07de6bdbe491d4680c3a39a30c0740995da2a1a277869206066e3/SQLAlchemy_Unchained-0.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "17c22a08356ed5eb91435a1646c14f03", "sha256": "074ad53acdd2f49316d41374599be63a292bb6879c4b1a52630a4d1bb965de78" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.9.1.tar.gz", "has_sig": false, "md5_digest": "17c22a08356ed5eb91435a1646c14f03", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 30809, "upload_time": "2019-09-30T18:33:09", "url": "https://files.pythonhosted.org/packages/07/ac/42b01b9184e02bb192248de7a09ea1d0f7aa01ba83132a08f1ba17631525/SQLAlchemy-Unchained-0.9.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "892a4e579d3fc278609ea6d83d1b03b3", "sha256": "3e6c31d127a8f14e3b1ca25ea0c0293d00c26c8f49f5b532aad4657a8915cc38" }, "downloads": -1, "filename": "SQLAlchemy_Unchained-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "892a4e579d3fc278609ea6d83d1b03b3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 31570, "upload_time": "2019-09-30T18:33:07", "url": "https://files.pythonhosted.org/packages/92/7c/87fc27e07de6bdbe491d4680c3a39a30c0740995da2a1a277869206066e3/SQLAlchemy_Unchained-0.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "17c22a08356ed5eb91435a1646c14f03", "sha256": "074ad53acdd2f49316d41374599be63a292bb6879c4b1a52630a4d1bb965de78" }, "downloads": -1, "filename": "SQLAlchemy-Unchained-0.9.1.tar.gz", "has_sig": false, "md5_digest": "17c22a08356ed5eb91435a1646c14f03", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 30809, "upload_time": "2019-09-30T18:33:09", "url": "https://files.pythonhosted.org/packages/07/ac/42b01b9184e02bb192248de7a09ea1d0f7aa01ba83132a08f1ba17631525/SQLAlchemy-Unchained-0.9.1.tar.gz" } ] }