#! /usr/bin/python
# coding: utf-8

"""Copy table from mysql to sqlite.

Require:
* SQLAlchemy
* MySQLdb or PyMySQL

Usage:
mylite.py "mysql+pymysql://user:password@host/db?charset=utf8" "sqlite:///out.db" table_name [table_name2...]
"""

import sqlalchemy as sa
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.dialects import mysql

@compiles(mysql.TINYINT, 'sqlite')
@compiles(mysql.SMALLINT, 'sqlite')
def compile_sqlite_tinyint(type_, compiler, **kw):
    return 'INTEGER'

@compiles(mysql.LONGBLOB, 'sqlite')
def compile_sqlite_tinyint(type_, compiler, **kw):
    return 'BLOB'


def copy_table(my_engine, lite_engine, table_name):
    meta = sa.MetaData(my_engine)
    table = sa.Table(table_name, meta, autoload=True)

    lite_engine.execute("DROP TABLE IF EXISTS " + table_name)
    table.create(lite_engine)

    rows = my_engine.execute(table.select()).fetchall()
    with lite_engine.begin() as con:
        for row in rows:
            con.execute(table.insert().values(**row))

def main():
    import sys
    mysql = sa.create_engine(sys.argv[1])
    lite  = sa.create_engine(sys.argv[2])
    for table in sys.argv[3:]:
        copy_table(mysql, lite, table)

if __name__ == '__main__':
    main()