easy-tormysql

This module provides a twice encapsulation of TorMySql based on Django's code style.


Install
pip install easy-tormysql==0.1.0

Documentation

  • About

This module provides a twice encapsulation of TorMySql based on Django's code style.

Support tornado and asyncio.

  • Installation

python3
pip install easy_tormysql >=0.2

python2
pip install easy_tormysql <0.2

  • Tutorial

init pool

from easy_tormysql import init_mysql
init_mysql(
    default={
        "max_connections" : 20, #max open connections
        "idle_seconds" : 7200, #conntion idle timeout time, 0 is not timeout
        "wait_connection_timeout" : 3, #wait connection timeout
        "host": "127.0.0.1",
        "user": "root",
        "passwd": "root",
        "charset": "utf8",
        "db": "example1"
    },
    other_connection={
        "host": "127.0.0.1",
        "user": "root",
        "passwd": "root",
        "charset": "utf8",
        "db": "example2",
        """
            treat all tables contain in default database(example1) automatically.
            you must define(use table-mapping class's lowercase name, not table's name) which tables contain in current database(example2) instead of default database.
        """
        "tables": [
            "example_table_mapping_class_lowercase_name"
        ]
    }
)

define models

  • single
from easy_tormysql import BaseModel, Field

class Subscriber(BaseModel):
    """
        table-mapping class(User) map to table tb_user.
        if undefine db_table,map to table user(class's lowercase name)
    """
    db_table = 'tb_user'
    name = Field()
    
    #   auto_now_add: whether current colum set with now time when insert data.
    create_time = Field(auto_now_add=True)
    
    #   auto_now_add: whether current colum set with now time when insert data.
    login_time = Field(auto_now=True) #auto_now: whether current colum set with now time when update data.
  • relationship
from easy_tormysql import BaseModel, Field, ForeignKey, ManyToManyField

class Author(BaseModel):
    name = Field()

class Tag(BaseModel):
    name = Field()

class Article(BaseModel):
    content = Field()
    create_time = Field()
    
    # many-to-one relationship
    author = ForeignKey(Author)
    
    # many-to-many relationship: must define the middle table's name
    tags = ManyToManyField(Tag, middle_table='article_tags')

use tornado

  • insert
# single
author = Author(name='Wang')

# one-to-many
article = Article(content='My story...')
author.article_set.add(article)
yield author.save()

# many-to-many
tag1, tag2 = Tag(name='poetry'), Tag(name='biography')
yield tag1.save()
yield tag2.save()
article.tags.add(tag1)
article.tags.add(tag2)
yield article.save()
  • query
# query unique record
author = yield Author.get(name='Wang')

# query all record
articles = yield Article.all()

# query
authors = yield Author.filter(name='Wang')
authors = yield Author.filter(name__in=('Wang','Lee'))
authors = yield Author.filter(name__contains='W')
articles = yield Author.filter(create_time__between=(date1,date2))

# order by
sorted_authors = yield Author.all(order_fields=("name",))

# group by
records = yield Author.filter(name='Wang', group_fields=("name",))

# one-to-many
articles = yield author.article_set.all()

# many-to-many
tags = yield article.tags.all()
articles = yield tag1.articles.all()
  • update
article.content = "programming..."
yield article.save()
  • delete
article.tags.remove(tag1)
article.tags.remove(tag2)
yield article.save()
yield article.delete()
  • in RequestHandler
from tornado.web import RequestHandler
from tornado.gen import coroutine


class ExampleHandler(RequestHandler):

    @coroutine
    def get(self):
        ...
        # single
        author = Author(name='Wang')
        
        # one-to-many
        article = Article(content='My story...')
        author.article_set.add(article)
        yield author.save()
        ...

use asyncio

  • insert
# single
author = Author(name='Wang')

# one-to-many
article = Article(content='My story...')
author.article_set.add(article)
await author.save()

# many-to-many
tag1, tag2 = Tag(name='poetry'), Tag(name='biography')
await tag1.save()
await tag2.save()
article.tags.add(tag1)
article.tags.add(tag2)
await article.save()
  • query
# query unique record
author = await Author.get(name='Wang')

# query all record
articles = await Article.all()

# query
authors = await Author.filter(name='Wang')
authors = await Author.filter(name__in=('Wang','Lee'))
authors = await Author.filter(name__contains='W')
articles = await Author.filter(create_time__between=(date1,date2))

# order by
sorted_authors = await Author.all(order_fields=("name",))

# group by
records = await Author.filter(name='Wang', group_fields=("name",))

# one-to-many
articles = await author.article_set.all()

# many-to-many
tags = await article.tags.all()
articles = await tag1.articles.all()
  • update
article.content = "programming..."
await article.save()
  • delete
article.tags.remove(tag1)
article.tags.remove(tag2)
await article.save()
await article.delete()
  • in async function
import asyncio
async def example():
    ...
    # single
    author = Author(name='Wang')
    
    # one-to-many
    article = Article(content='My story...')
    author.article_set.add(article)
    await author.save()
    ...
       
ioloop = asyncio.events.get_event_loop()
ioloop.run_until_complete(example())