Skip to content

Instantly share code, notes, and snippets.

@mikaelhg
Created November 25, 2012 11:37
Show Gist options
  • Save mikaelhg/4143201 to your computer and use it in GitHub Desktop.
Save mikaelhg/4143201 to your computer and use it in GitHub Desktop.
Automatically generate / reverse engineer a MySQL database and generate Scala JPA classes for tables
#!/usr/bin/python
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.engine import reflection
from datetime import datetime
engine = create_engine('mysql://username:@localhost/foobar')
insp = reflection.Inspector.from_engine(engine)
def scala_table_name(table_name):
if table_name.endswith('_t'): return table_name[:-2]
else: return table_name
def scala_column_name(column_name):
if column_name == 'type_f': return '`type`'
elif column_name.endswith('_f'): return column_name[:-2]
else: return column_name
def scala_type(python_type):
if python_type == str: return "String"
elif python_type == int: return "java.lang.Long" # Scala "Long" isn't nullable by JPA
elif python_type == datetime: return "java.util.Calendar"
else: raise "Bad Type"
BAD_COLUMNS = ('id_f', 'ts', 'host', 'vers', 'archived')
COLUMN_TEMPLATE = """
@javax.persistence.Column(name="%(name)s") @scala.reflect.BeanProperty var %(scala_name)s : %(type)s = _
"""[1:-1]
CLASS_TEMPLATE = """
@javax.persistence.Entity(name="%s")
class %s extends FooBarTable {
"""[:-1]
for table_name in insp.get_table_names():
print CLASS_TEMPLATE % (table_name, scala_table_name(table_name))
for column in insp.get_columns(table_name):
if column['name'] in BAD_COLUMNS: continue
print COLUMN_TEMPLATE % \
{ 'name': column['name'],
'scala_name' : scala_column_name(column['name']),
'type' : scala_type(column['type'].python_type) }
print "}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment