{ "info": { "author": "mig contributors", "author_email": "joar@talka.tv", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Database" ], "description": "===========================\r\nmig - SQLAlchemy migrations\r\n===========================\r\n\r\nmig ([M]ediaGoblin [i]s [G]reat!) was first written by \r\n`Christopher Allan Webber `_ for\r\n`GNU MediaGoblin `_.\r\n\r\nSince then, `Joar Wandborg `_ has extracted the essentials\r\nof the functionality from MediaGoblin and into a separate package which's README\r\nyou are currently reading.\r\n\r\n\r\n---------------\r\nInit migrations\r\n---------------\r\n\r\nEither run ``mig.run(engine, name, models, migrations)`` or add the ``mig.models.MigrationData`` table manually.\r\n\r\n.. note::\r\n\r\n If your database is already populated and there are no migration version rows in the MigrationData table, ``mig.run()`` will fail.\r\n\r\nIf you already have a populated database you'll need to create a ``MigrationData(name='migrations_handle', version=0)`` row for your migrations in the MigrationData table, otherwise mig will try to initiate the database.\r\n\r\n\r\n===============\r\nExample setup\r\n===============\r\n\r\n\r\n----------------\r\nCreate migration\r\n----------------\r\n\r\n.. code-block:: python\r\n\r\n from mig import RegisterMigration\r\n\r\n from sqlalchemy import MetaData, Table, Column, Integer, Unicode, DateTime, \\\r\n ForeignKey\r\n\r\n MIGRATIONS = {}\r\n\r\n\r\n @RegisterMigration(1, MIGRATIONS)\r\n def create_site_table(db_conn):\r\n metadata = MetaData(bind=db_conn.bind)\r\n\r\n user_table = Table('user', metadata, autoload=True,\r\n autoload_with=db_conn.bind)\r\n\r\n site_table = Table('site', metadata,\r\n Column('id', Integer, primary_key=True),\r\n Column('domain', Unicode),\r\n Column('owner_id', Integer, ForeignKey(user_table.columns['id'])))\r\n\r\n site_table.create()\r\n\r\n db_conn.commit()\r\n\r\n\r\n @RegisterMigration(2, MIGRATIONS)\r\n def item_add_site_id(db_conn):\r\n metadata = MetaData(bind=db_conn.bind)\r\n\r\n item_table = Table('item', metadata, autoload=True)\r\n site_table = Table('site', metadata, autoload=True)\r\n\r\n site_id_col = Column('site_id', Integer, ForeignKey(\r\n site_table.columns['id']))\r\n\r\n site_id_col.create(item_table)\r\n\r\n db_conn.commit()\r\n\r\n\r\n---------------\r\nRegister models\r\n---------------\r\n\r\n.. code-block:: python\r\n\r\n import bcrypt\r\n\r\n from datetime import datetime\r\n\r\n from migrate import changeset\r\n\r\n from talkatv import db\r\n\r\n\r\n class User(db.Model):\r\n id = db.Column(db.Integer, primary_key=True)\r\n username = db.Column(db.String(60), unique=True)\r\n email = db.Column(db.String(255), unique=True)\r\n password = db.Column(db.String(60))\r\n\r\n def __init__(self, username, email, password=None, openid=None):\r\n self.username = username\r\n self.email = email\r\n\r\n if password:\r\n self.set_password(password)\r\n\r\n if openid:\r\n self.openid = openid\r\n\r\n def __repr__(self):\r\n return ''.format(self.username)\r\n\r\n def set_password(self, password):\r\n self.password = bcrypt.hashpw(password, bcrypt.gensalt())\r\n\r\n def check_password(self, password):\r\n return bcrypt.hashpw(password, self.password) == self.password\r\n\r\n\r\n class OpenID(db.Model):\r\n id = db.Column(db.Integer, primary_key=True)\r\n url = db.Column(db.String())\r\n created = db.Column(db.DateTime)\r\n\r\n user_id = db.Column(db.Integer, db.ForeignKey('user.id'))\r\n user = db.relationship('User',\r\n backref=db.backref('openids', lazy='dynamic'))\r\n\r\n def __init__(self, user, url):\r\n self.created = datetime.utcnow()\r\n self.user = user\r\n self.url = url\r\n\r\n\r\n class Item(db.Model):\r\n id = db.Column(db.Integer, primary_key=True)\r\n title = db.Column(db.String())\r\n url = db.Column(db.String(), unique=True)\r\n created = db.Column(db.DateTime)\r\n\r\n site_id = db.Column(db.Integer, db.ForeignKey('site.id'))\r\n site = db.relationship('Site',\r\n backref=db.backref('items', lazy='dynamic'))\r\n\r\n def __init__(self, url, title, site=None):\r\n if site:\r\n self.site = site\r\n\r\n self.title = title\r\n self.url = url\r\n\r\n self.created = datetime.utcnow()\r\n\r\n def __repr__(self):\r\n return ''.format(\r\n self.url,\r\n self.site.owner.username if self.site else None)\r\n\r\n def as_dict(self):\r\n me = {\r\n 'id': self.id,\r\n 'title': self.title,\r\n 'url': self.url,\r\n 'created': self.created.isoformat()}\r\n if self.site:\r\n me.update({'owner': self.site.owner.id})\r\n\r\n return me\r\n\r\n\r\n class Site(db.Model):\r\n id = db.Column(db.Integer, primary_key=True)\r\n created = db.Column(db.DateTime)\r\n domain = db.Column(db.String)\r\n\r\n owner_id = db.Column(db.Integer, db.ForeignKey('user.id'))\r\n owner = db.relationship('User',\r\n backref=db.backref('sites', lazy='dynamic'))\r\n\r\n def __init__(self, owner, domain):\r\n self.owner = owner\r\n self.domain = domain\r\n\r\n self.created = datetime.utcnow()\r\n\r\n def __repr__(self):\r\n return ''.format(\r\n self.domain,\r\n self.owner.username)\r\n\r\n\r\n class Comment(db.Model):\r\n id = db.Column(db.Integer, primary_key=True)\r\n created = db.Column(db.DateTime)\r\n text = db.Column(db.String())\r\n\r\n item_id = db.Column(db.Integer, db.ForeignKey('item.id'))\r\n item = db.relationship('Item',\r\n backref=db.backref('comments', lazy='dynamic'))\r\n\r\n user_id = db.Column(db.Integer, db.ForeignKey('user.id'))\r\n user = db.relationship('User',\r\n backref=db.backref('comments', lazy='dynamic'))\r\n\r\n def __init__(self, item, user, text):\r\n self.item = item\r\n self.user = user\r\n self.text = text\r\n\r\n self.created = datetime.utcnow()\r\n\r\n def __repr__(self):\r\n return ''.format(\r\n self.text[:25] + ('...' if len(self.text) > 25 else ''),\r\n self.user.username)\r\n\r\n def as_dict(self):\r\n me = {\r\n 'id': self.id,\r\n 'item': self.item.id,\r\n 'user_id': self.user.id,\r\n 'username': self.user.username,\r\n 'text': self.text,\r\n 'created': self.created.isoformat()}\r\n return me\r\n\r\n MODELS = [\r\n User,\r\n Comment,\r\n Item,\r\n OpenID,\r\n Site]\r\n\r\n\r\n--------------\r\nRun migrations\r\n--------------\r\n\r\n.. code-block:: python\r\n\r\n from mig import run\r\n from mig.models import MigrationData\r\n\r\n from yourapp import db\r\n from yourapp.models import MODELS\r\n from yourapp.migrations import MIGRATIONS\r\n\r\n\r\n\r\n def check_or_create_mig_data():\r\n if not db.engine.dialect.has_table(db.session, 'mig__data'):\r\n # Create migration table\r\n MigrationData.__table__.create(db.engine)\r\n\r\n # Create the first migration, so that mig doesn't init.\r\n migration = MigrationData(name=u'__main__', version=0)\r\n db.session.add(migration)\r\n db.session.commit()\r\n\r\n\r\n if __name__ == '__main__':\r\n if db.engine.dialect.has_table(db.session, 'user'):\r\n # The DB is already populated, check if migrations are active,\r\n # otherwise create the migration data table\r\n check_or_create_mig_data()\r\n\r\n run(db.engine, u'__main__', MODELS, MIGRATIONS)", "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/joar/mig/", "keywords": "", "license": "UNKNOWN", "maintainer": "", "maintainer_email": "", "name": "mig", "package_url": "https://pypi.org/project/mig/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/mig/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/joar/mig/" }, "release_url": "https://pypi.org/project/mig/0.0.6/", "requires_dist": null, "requires_python": null, "summary": "SQLAlchemy migrations", "version": "0.0.6" }, "last_serial": 794779, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "cb683fda06ce9127ef4fd2657339b845", "sha256": "889a05e12d3db7f17bb41c124e86437f15a96cef6cd6e2917b2e9905e3fa243b" }, "downloads": -1, "filename": "mig-0.0.1.tar.gz", "has_sig": false, "md5_digest": "cb683fda06ce9127ef4fd2657339b845", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6014, "upload_time": "2012-09-04T08:14:43", "url": "https://files.pythonhosted.org/packages/35/46/2b8cadbc31ac62ea4e350885079e63d2386a65a508d2a2c298db28b51509/mig-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "766e85889fded864917a6cc2f6a6ebf3", "sha256": "73c6cdaf42d40450549eabc8549b1c416d4089886552da17a9fdff3c217d1fec" }, "downloads": -1, "filename": "mig-0.0.2.tar.gz", "has_sig": false, "md5_digest": "766e85889fded864917a6cc2f6a6ebf3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6068, "upload_time": "2012-09-04T08:19:38", "url": "https://files.pythonhosted.org/packages/41/99/8a50e0f50858585c4dd3ec0b5c4b6980976df32235d97dfce61e270ed2ea/mig-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "d3e3e0d19a242d88ede22e54dddbc51c", "sha256": "e721a15e61ce9d0f42a7cb39e7ae7ebec2056d421bc5c5a275e0f28d7280824f" }, "downloads": -1, "filename": "mig-0.0.3.tar.gz", "has_sig": false, "md5_digest": "d3e3e0d19a242d88ede22e54dddbc51c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6073, "upload_time": "2012-09-04T08:21:45", "url": "https://files.pythonhosted.org/packages/f0/34/bc985c090f0849414a3cb9b8c034881b438119bc5dc2263a97b8449dd272/mig-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "701a9639b7e494c159bda6a69d1c28ba", "sha256": "9881d39e4e1ba83ad42e74adf8dae6c83a0ef0462dbbda8265f86c347987fa55" }, "downloads": -1, "filename": "mig-0.0.4.tar.gz", "has_sig": false, "md5_digest": "701a9639b7e494c159bda6a69d1c28ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6120, "upload_time": "2012-09-04T08:25:15", "url": "https://files.pythonhosted.org/packages/36/bd/b3e2a9389d6dabb9e65a18e4534b610286648ca752bcb6beda429b7f0e9f/mig-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "9f0b4fdc78853d66d038642dc6b3c512", "sha256": "1cc5187af8cb36046dd85848d6a602abdac751cc2c4fd74adf519a42e6f357b1" }, "downloads": -1, "filename": "mig-0.0.5.tar.gz", "has_sig": false, "md5_digest": "9f0b4fdc78853d66d038642dc6b3c512", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6458, "upload_time": "2012-09-04T20:30:56", "url": "https://files.pythonhosted.org/packages/14/7c/e10c312ced8028542d6957766f2929b72bce56b53f9b88cbbe198f8fe064/mig-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "ca79a0580f3ca71641c1eea0bba3b15f", "sha256": "e155e9a4d36113fadc12076534a35396ae3862148a9399d15722c57db444a86a" }, "downloads": -1, "filename": "mig-0.0.6.tar.gz", "has_sig": false, "md5_digest": "ca79a0580f3ca71641c1eea0bba3b15f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6493, "upload_time": "2012-09-04T20:33:14", "url": "https://files.pythonhosted.org/packages/1d/e8/1907daa438c974557f6a536cb97ae2163f1906cb22597113b2967f7e8860/mig-0.0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ca79a0580f3ca71641c1eea0bba3b15f", "sha256": "e155e9a4d36113fadc12076534a35396ae3862148a9399d15722c57db444a86a" }, "downloads": -1, "filename": "mig-0.0.6.tar.gz", "has_sig": false, "md5_digest": "ca79a0580f3ca71641c1eea0bba3b15f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6493, "upload_time": "2012-09-04T20:33:14", "url": "https://files.pythonhosted.org/packages/1d/e8/1907daa438c974557f6a536cb97ae2163f1906cb22597113b2967f7e8860/mig-0.0.6.tar.gz" } ] }