{ "info": { "author": "Torsten Schmits, Tyler Long", "author_email": "tek@gentoo64.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "sqlpharmacy\n=========\n- **News**: sqlpharmacy is fully compatible with the newest SQLAlchemy 0.7.9.\n- **Notice**: sqlpharmacy is NOT YET compatible with SQLAlchemy 0.8.x.\n\n\n|\n\nIntroduction\n------------\nPython ORM framework which enables you to get started in less than a minute!\n\nSuper easy to setup and super easy to use, yet super powerful!\n\nYou would regret that you didn't discorver it earlier!\n\n\n|\n\nFeatures\n--------\n- quick: you could get and play with it in less than a minute. It couldn't be more straightforward.\n- easy: you don't have to write any SQL statements, including those \"create table xxx ...\" ones.\n- simple: the core code counts only 233 lines including comments and pydocs, there is no room for bugs.\n- free: released under BSD license, you are free to use it and distribute it.\n- powerful: built upon SQLAlchemy and doesn't compromise its power.\n- support relationships by means of python decorators.\n- support table inheritance in a most natural way.\n- support multiple databases: you can map your models to many databases without difficulty.\n- write less, do more: taking advantage of python metaclass reduces data modeling code dramatically.\n- long-term maintained: Continous efforts are taken to improve and maintain it.\n\n\n|\n\nQuick Start\n-----------\n\n::\n\n pip install sqlpharmacy\n\nRefer to the following examples to write your own database manipulation code.\n\n\r\n|\r\n\r\nHello World example\r\n-------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class User:\r\n name = Column(String(30))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://') # database urls: http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls\r\n db.create_tables() # create tables, you don't have to write any SQL.\r\n \r\n user = User(name = 'Hello World')\r\n db.session.add_then_commit(user) # commit user to database.\r\n \r\n user = db.session.query(User).get(1)\r\n print('My name is', user.name)\r\n print('created_at', user.created_at) # created_at and updated_at timestamps are added automatically.\r\n print('updated_at', user.updated_at)\r\n \r\n user.name = 'Tyler Long'\r\n db.session.commit() # commit changes to database.\r\n print('My name is', user.name)\r\n print('created_at', user.created_at)\r\n print('updated_at', user.updated_at)\r\n\r\n\r\n|\r\n\r\nMany-to-one relationship example\r\n--------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String, Text\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class Question:\r\n title = Column(String(70))\r\n content = Column(Text)\r\n \r\n @Database.many_to_one(Question)\r\n class Answer:\r\n content = Column(Text)\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n question = Question(title = 'What is sqlpharmacy?', content = 'What is sqlpharmacy?')\r\n answer = Answer(question = question, content = 'sqlpharmacy is a Python ORM framework which enables you to get started in less than a minute!')\r\n db.session.add_then_commit(answer)\r\n \r\n question = db.session.query(Question).get(1)\r\n print('The question is:', question.title)\r\n print('The answer is:', question.answers.first().content)\r\n\r\n\r\n|\r\n\r\nMany-to-one relationship options example\r\n----------------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String, Text\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class Question:\r\n title = Column(String(70))\r\n content = Column(Text)\r\n \r\n @Database.many_to_one(Question, ref_name = 'question', backref_name = 'answers')\r\n class Answer:\r\n content = Column(Text)\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n question = Question(title = 'What is sqlpharmacy?', content = 'What is sqlpharmacy?')\r\n answer = Answer(question = question, content = 'sqlpharmacy is a Python ORM framework which enables you to get started in less than a minute!')\r\n db.session.add_then_commit(answer)\r\n \r\n question = db.session.query(Question).get(1)\r\n print('The question is:', question.title)\r\n print('The answer is:', question.answers.first().content)\r\n\r\n\r\n|\r\n\r\nMany-to-one relationship with oneself example\r\n---------------------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n @Database.many_to_one('Node', ref_name = 'parent_node', backref_name = 'children_nodes')\r\n class Node:\r\n name = Column(String(70))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n root_node = Node(name = 'root')\r\n node1 = Node(name = 'node1', parent_node = root_node)\r\n node2 = Node(name = 'node2', parent_node = root_node)\r\n db.session.add_then_commit(root_node)\r\n \r\n root_node = db.session.query(Node).filter_by(name = 'root').one()\r\n print('Root node has {0} children nodes, they are {1}'\\\r\n .format(root_node.children_nodes.count(), ', '.join(node.name for node in root_node.children_nodes)))\r\n\r\n\r\n|\r\n\r\nMany-to-many relationship example\r\n---------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class User:\r\n name = Column(String(30))\r\n \r\n @Database.many_to_many(User)\r\n class Role:\r\n name = Column(String(30))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n user1 = User(name = 'Tyler Long')\r\n user2 = User(name = 'Peter Lau')\r\n role = Role(name = 'Administrator', users = [user1, user2])\r\n db.session.add_then_commit(role)\r\n \r\n admin_role = db.session.query(Role).filter_by(name = 'Administrator').one()\r\n print(', '.join([user.name for user in admin_role.users]), 'are administrators')\r\n\r\n\r\n|\r\n\r\nMany-to-many relationship options example\r\n-----------------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class User:\r\n name = Column(String(30))\r\n \r\n @Database.many_to_many(User, ref_name = 'users', backref_name = 'roles', middle_table_name = 'user_role')\r\n class Role:\r\n name = Column(String(30))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n user1 = User(name = 'Tyler Long')\r\n user2 = User(name = 'Peter Lau')\r\n role = Role(name = 'Administrator', users = [user1, user2])\r\n db.session.add_then_commit(role)\r\n \r\n admin_role = db.session.query(Role).filter_by(name = 'Administrator').one()\r\n print(', '.join([user.name for user in admin_role.users]), 'are administrators')\r\n\r\n\r\n|\r\n\r\nMany-to-many relationship with oneself example\r\n----------------------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n @Database.many_to_many('User', ref_name = 'users_i_follow', backref_name = 'users_follow_me')\r\n class User:\r\n name = Column(String(30))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n peter = User(name = 'Peter Lau')\r\n mark = User(name = 'Mark Wong', users_i_follow = [peter, ])\r\n tyler = User(name = 'Tyler Long', users_i_follow = [peter, ], users_follow_me = [mark, ])\r\n db.session.add_then_commit(tyler)\r\n \r\n tyler = db.session.query(User).filter_by(name = 'Tyler Long').one()\r\n print('Tyler Long is following:', ', '.join(user.name for user in tyler.users_i_follow))\r\n print('People who are following Tyler Long:', ', '.join(user.name for user in tyler.users_follow_me))\r\n mark = db.session.query(User).filter_by(name = 'Mark Wong').one()\r\n print('Mark Wong is following:', ', '.join(user.name for user in mark.users_i_follow))\r\n\r\n\r\n|\r\n\r\nOne-to-one relationship example\r\n-------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class User:\r\n name = Column(String(30))\r\n \r\n @Database.one_to_one(User)\r\n class Contact:\r\n email = Column(String(70))\r\n address = Column(String(70))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n contact = Contact(email = 'quick.orm.feedback@gmail.com', address = 'Shenzhen, China')\r\n user = User(name = 'Tyler Long', contact = contact)\r\n db.session.add_then_commit(user)\r\n \r\n user = db.session.query(User).get(1)\r\n print('User:', user.name)\r\n print('Email:', user.contact.email)\r\n print('Address:', user.contact.address)\r\n\r\n\r\n|\r\n\r\nMultiple many-to-one relationships example\r\n------------------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String, Text\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class User:\r\n name = Column(String(30))\r\n \r\n @Database.many_to_one(User, ref_name = 'author', backref_name = 'articles_authored')\r\n @Database.many_to_one(User, ref_name = 'editor', backref_name = 'articles_edited')\r\n class Article:\r\n title = Column(String(80))\r\n content = Column(Text)\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n author = User(name = 'Tyler Long')\r\n editor = User(name = 'Peter Lau')\r\n article = Article(author = author, editor = editor, title = 'sqlpharmacy is super quick and easy',\r\n content = 'sqlpharmacy is super quick and easy. Believe it or not.')\r\n db.session.add_then_commit(article)\r\n \r\n article = db.session.query(Article).get(1)\r\n print('Article:', article.title)\r\n print('Author:', article.author.name)\r\n print('Editor:', article.editor.name)\r\n\r\n\r\n|\r\n\r\nPerforming raw sql query example\r\n--------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class User:\r\n name = Column(String(70))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n count = db.engine.execute('select count(name) from user').scalar()\r\n print('There are {0} users in total'.format(count))\r\n\r\n\r\n|\r\n\r\nMultiple databases example\r\n--------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class User:\r\n name = Column(String(30))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db1 = Database('sqlite://')\r\n db1.create_tables()\r\n \r\n db2 = Database('sqlite://')\r\n db2.create_tables()\r\n \r\n user1 = User(name = 'user in db1')\r\n user2 = User(name = 'user in db2')\r\n db1.session.add_then_commit(user1)\r\n db2.session.add_then_commit(user2)\r\n \r\n print('I am', db1.session.query(User).get(1).name)\r\n print('I am', db2.session.query(User).get(1).name)\r\n\r\n\r\n|\r\n\r\nTable inheritance example\r\n-------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String, Text\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n class User:\r\n name = Column(String(70))\r\n \r\n @Database.many_to_one(User)\r\n class Post:\r\n content = Column(Text)\r\n \r\n class Question(Post):\r\n title = Column(String(70))\r\n \r\n @Database.many_to_one(Question)\r\n class Answer(Post):\r\n pass\r\n \r\n @Database.many_to_one(Post)\r\n class Comment(Post):\r\n pass\r\n \r\n @Database.many_to_many(Post)\r\n class Tag:\r\n name = Column(String(70))\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n user1 = User(name = 'Tyler Long')\r\n user2 = User(name = 'Peter Lau')\r\n \r\n tag1 = Tag(name = 'sqlpharmacy')\r\n tag2 = Tag(name = 'nice')\r\n \r\n question = Question(user = user1, title = 'What is sqlpharmacy?', content = 'What is sqlpharmacy?', tags = [tag1, ])\r\n question2 = Question(user = user1, title = 'Have you tried sqlpharmacy?', content = 'Have you tried sqlpharmacy?', tags = [tag1, ])\r\n \r\n answer = Answer(user = user1, question = question, tags = [tag1, ],\r\n content = 'sqlpharmacy is a Python ORM framework which enables you to get started in less than a minute!')\r\n \r\n comment1 = Comment(user = user2, content = 'good question', post = question)\r\n comment2 = Comment(user = user2, content = 'nice answer', post = answer, tags = [tag2, ])\r\n \r\n db.session.add_all_then_commit([question, question2, answer, comment1, comment2, tag1, tag2, ])\r\n \r\n question = db.session.query(Question).get(1)\r\n print('tags for question \"{0}\": \"{1}\"'.format(question.title, ', '.join(tag.name for tag in question.tags)))\r\n print('new comment for question:', question.comments.first().content)\r\n print('new comment for answer:', question.answers.first().comments.first().content)\r\n \r\n user = db.session.query(User).filter_by(name = 'Peter Lau').one()\r\n print('Peter Lau has posted {0} comments'.format(user.comments.count()))\r\n \r\n tag = db.session.query(Tag).filter_by(name = 'sqlpharmacy').first()\r\n print('{0} questions are tagged \"sqlpharmacy\"'.format(tag.questions.count()))\r\n\r\n\r\n|\r\n\r\nMetaBuilder to avoid duplicate code example\r\n-------------------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String\r\n \r\n class DefaultModel:\r\n name = Column(String(70))\r\n \r\n __metaclass__ = Database.MetaBuilder(DefaultModel)\r\n \r\n class User:\r\n pass\r\n \r\n class Group:\r\n pass\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n user = User(name = 'tylerlong')\r\n db.session.add(user)\r\n group = Group(name = 'python')\r\n db.session.add_then_commit(group)\r\n \r\n print(user.name)\r\n print(group.name)\r\n\r\n\r\n|\r\n\r\nModel for stackoverflow.com example\r\n-----------------------------------\r\n\r\n::\r\n\r\n from sqlpharmacy.core import Database\r\n from sqlalchemy import Column, String, Text\r\n \r\n __metaclass__ = Database.DefaultMeta\r\n \r\n @Database.many_to_many('User', ref_name = 'followed_users', backref_name = 'followers')\r\n class User:\r\n email = Column(String(200))\r\n name = Column(String(100))\r\n \r\n @Database.many_to_one(User)\r\n class Post:\r\n content = Column(Text)\r\n \r\n @Database.many_to_one(Post)\r\n class Comment(Post):\r\n pass\r\n \r\n class Question(Post):\r\n title = Column(String(200))\r\n \r\n @Database.many_to_one(Question)\r\n class Answer(Post):\r\n pass\r\n \r\n @Database.many_to_many(Post)\r\n class Tag:\r\n name = Column(String(50))\r\n \r\n @Database.many_to_one(User, ref_name = 'sender', backref_name = 'messages_sent')\r\n @Database.many_to_one(User, ref_name = 'receiver', backref_name = 'messages_received')\r\n class Message:\r\n content = Column(Text)\r\n \r\n @Database.many_to_one(User)\r\n @Database.many_to_one(Post)\r\n class Vote:\r\n type = Column(String(20)) #\"vote_up\" or \"vote_down\"\r\n \r\n Database.register()\r\n \r\n if __name__ == '__main__':\r\n db = Database('sqlite://')\r\n db.create_tables()\r\n \r\n user1 = User(email = 'tylerlong@example.com', name = 'Tyler Long')\r\n user2 = User(email = 'peterlau@example.com', name = 'Peter Lau')\r\n \r\n tag1 = Tag(name = 'Python')\r\n tag2 = Tag(name = 'sqlpharmacy')\r\n \r\n question1 = Question(user = user1, title = 'Can you program in Python?', content = 'RT')\r\n question2 = Question(user = user1, title = 'Do you know sqlpharmacy?', content = 'RT')\r\n \r\n answer1 = Answer(user = user2, question = question1, content = 'Yes I can')\r\n answer2 = Answer(user = user2, question = question2, content = 'No I don\\'t')\r\n \r\n comment1 = Comment(user = user1, content = 'You rock')\r\n comment2 = Comment(user = user1, content = 'You suck')\r\n \r\n answer1.comments = [comment1,]\r\n answer2.comments = [comment2,]\r\n \r\n user1.followers = [user2,]\r\n question1.tags = [tag1,]\r\n answer2.tags = [tag2,]\r\n \r\n vote1 = Vote(user = user1, type = 'vote_up', post = question1)\r\n vote2 = Vote(user = user2, type = 'vote_up', post = question1)\r\n vote2 = Vote(user = user2, type = 'vote_down', post = question2)\r\n \r\n db.session.add_all_then_commit([user1, user2,])\r\n \r\n print(user2.name, 'is following', ', '.join(user.name for user in user2.followed_users))\r\n print(user1.name, 'questions:', ', '.join(question.title for question in user1.questions))\r\n print('question1 tags:', ', '.join(tag.name for tag in question1.tags))\r\n print('answer2 comments:', ', '.join(comment.content for comment in answer2.comments))\r\n print('answer \"', answer1.content, '\" is for question: \"', answer1.question.title, '\"')\r\n print('there are {0} vote_ups for question \"{1}\"'.format(question1.votes.filter_by(type = 'vote_up').count(), question1.title))\n\n\n|\n\nExamples from real life\n-----------------------\n- Everblog_ is a personal blogging platform taking advantage of evernote, it chooses sqlpharmacy as its ORM framework. Refer to `everblog's database model file`_ for more detail.\n\n.. _Everblog: https://github.com/tylerlong/everblog\n.. _`everblog's database model file`: https://github.com/tylerlong/everblog/blob/master/everblog/models.py\n\nIf you know any other successful stories about sqlpharmacy, do tell me and I will list them above.\n\n\n|\n\nWhere to learn more about sqlpharmacy?\n------------------------------------\nAs said above, sqlpharmacy is built upon SQLAlchemy. sqlpharmacy never tries to hide SQLAlchemy's flexibility and power. Everything availiable in SQLAlchemy is still available in sqlpharmacy.\n\nSo please read the documents of SQLAlchemy, you would learn much more there than you could here.\n\nRead sqlpharmacy's source code, try to improve it.\n\n\n|\n\nYou wanna involve?\n------------------\nsqlpharmacy is released under BSD lisence.\n\nThe source code is hosted on github: https://github.com/tylerlong/sqlpharmacy\n\n\n|\n\nAcknowledgements\n----------------\nsqlpharmacy is built upon SQLAlchemy - the famous Python SQL Toolkit and Object Relational Mapper. All of the glory belongs to the SQLAlchemy development team and the SQLAlchemy community! My contribution to sqlpharmacy becomes trivial compared with theirs( to SQLAlchemy).\n\n\n|\n\nFeedback\n--------\nComments, suggestions, questions, free beer, t-shirts, kindles, ipads ... are all welcome!\n\nEmail: quick.orm.feedback@gmail.com\n\n\n|\n\ntodo list\n---------\n#. full text search. (class decorator for model?)\n#. orm for nosql? such as this one: http://qslack.com/projects/rhino-a-ruby-hbase-orm/\n#. ref_grandchildren can't access some attributes of grandchildren. for example: everblog project: tag.blog_entrys.lang report an error.\n#. generate visual charts according to model. It is good for analyzing and demonstrating.\n#. multiple many_to_many between two models\n#. make table name customizable", "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/tylerlong/sqlpharmacy", "keywords": null, "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "sqlpharmacy", "package_url": "https://pypi.org/project/sqlpharmacy/", "platform": "any", "project_url": "https://pypi.org/project/sqlpharmacy/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/tylerlong/sqlpharmacy" }, "release_url": "https://pypi.org/project/sqlpharmacy/3.0.0/", "requires_dist": null, "requires_python": null, "summary": "Python ORM framework, quick, easy, simple yet powerful, based on sqlalchemy.", "version": "3.0.0" }, "last_serial": 870131, "releases": { "3.0.0": [ { "comment_text": "", "digests": { "md5": "74f381895f22b7acb1d20f9789acd5a8", "sha256": "10f656b29083218ddf15ce52457973727ae84001cec838a61098028f4e1e71d0" }, "downloads": -1, "filename": "sqlpharmacy-3.0.0.tar.gz", "has_sig": true, "md5_digest": "74f381895f22b7acb1d20f9789acd5a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14740, "upload_time": "2013-09-20T17:46:03", "url": "https://files.pythonhosted.org/packages/a5/56/056a87e0365c01b46ce764d147b789572fa8368ba8832b59eaa65d568b0b/sqlpharmacy-3.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "74f381895f22b7acb1d20f9789acd5a8", "sha256": "10f656b29083218ddf15ce52457973727ae84001cec838a61098028f4e1e71d0" }, "downloads": -1, "filename": "sqlpharmacy-3.0.0.tar.gz", "has_sig": true, "md5_digest": "74f381895f22b7acb1d20f9789acd5a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14740, "upload_time": "2013-09-20T17:46:03", "url": "https://files.pythonhosted.org/packages/a5/56/056a87e0365c01b46ce764d147b789572fa8368ba8832b59eaa65d568b0b/sqlpharmacy-3.0.0.tar.gz" } ] }