Some time ago I talk about to do it.

Finally I have to do it.

It can be improved to a form in appadmin, use the model to another db
(postgresql, etc), and generate the file in /models.

You can see the code below:

----------------------------------------------------------

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#script to generate schemas from dbs
#by Alexandre Andrade [email protected]
#www.hipercenter.com

#config it here
passwd="mypass"
user="myuser"
host="localhost"
db = 'mydb'
port='3306'


def query(bd,sql):
    bd.query(sql)
    r = bd.store_result()
    rows = r.fetch_row(maxrows=0,how=1)
    return rows

def get_tables():
    rows = query(bd,'show tables')
    tables=[]
    for row in rows:
        tables.append(row['Tables_in_'+db])
    return tables

#tables()

def get_fields(table):
    print table
    rows = query(bd,'show fields from '+ table)
    fields=[]
    for row in rows:
        #print row
        fields.append(row)
    return fields

def field_type(field):
    if field['Type'][0:7]=='varchar':
        tipo = ",'string'"
    elif field['Type'][:8]=='longtext':
        tipo = ",'text'"
    elif field['Type'][:3]=='int':
        tipo = ",'integer'"
    elif field['Type'][:4]=='date':
        tipo = ",'date'"
    elif field['Type'][:7]=='tinyint':
        tipo = ",'int'"
    elif field['Type'][:11]=='mediumtext':
        tipo = ",'text'"
    elif field['Type'][:4]=='char':
        tipo = ",'text'"
    else:
        print  field['Type'][0:10]
    return tipo

def primarykey(field):
    if field['Extra']=='auto_increment':
        pk = True
    else:
        pk = False
    return pk

def define_table(table):
    fields =  get_fields(table)
    result = []
    head = 'db = DAL("mysql://'+ user+ ':'+passwd+'@'+host+':'+port+'/'+db+'",
pool_size=10)\r\r'

    line = "db.define_table('"+table+"'"
    result.append(line)
    for field in fields:
        if primarykey(field) == True:
            pk =field['Field']
            #print pk
        tipo = field_type(field)
        line = "    Field('"+field['Field']+"'"+tipo+")"
        result.append(line)
        line
    try:
        line = "    primarykey=['"+pk+"']"
        result.append(line)
    except:
        pass
    out = ',\r'.join(result)
    output = head + out + '\r)'
    print output
    return output

def define_db():
    tables = get_tables()
    r = []
    for table in tables:
        r.append(define_table(table))
    result = '\r \r'.join(r)
    return result

r = define_db()
f = open('db_'+db+'.py', 'w')
f.write(r)
f.close()

-----------------------------------------------------------

-- 
Atenciosamente

-- 
=========================
Alexandre Andrade
Hipercenter.com
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#script to generate schemas from dbs
#by Alexandre Andrade [email protected]
#www.hipercenter.com

#place your config here
passwd="mypass"
user="myuser"
host="localhost"
db = 'mydb'
port='3306'

import MySQLdb
bd=MySQLdb.connect(host=host,user=user,passwd=passwd,db = db, use_unicode=True)

def query(bd,sql):
    bd.query(sql)
    r = bd.store_result()
    rows = r.fetch_row(maxrows=0,how=1)
    return rows
    
def get_tables():
    rows = query(bd,'show tables')
    tables=[]
    for row in rows:
        tables.append(row['Tables_in_'+db])
    return tables
    
#tables()

def get_fields(table):
    print table
    rows = query(bd,'show fields from '+ table)
    fields=[]
    for row in rows:
        #print row
        fields.append(row)
    return fields
    
def field_type(field):
    if field['Type'][0:7]=='varchar':
        tipo = ",'string'"
    elif field['Type'][:8]=='longtext':
        tipo = ",'text'"
    elif field['Type'][:3]=='int':
        tipo = ",'integer'"
    elif field['Type'][:4]=='date':
        tipo = ",'date'"
    elif field['Type'][:7]=='tinyint':
        tipo = ",'int'"
    elif field['Type'][:11]=='mediumtext':
        tipo = ",'text'"
    elif field['Type'][:4]=='char':
        tipo = ",'text'"
    else:
        print  field['Type'][0:10]
    return tipo
    
def primarykey(field):
    if field['Extra']=='auto_increment':
        pk = True
    else:
        pk = False
    return pk

def define_table(table):
    fields =  get_fields(table)
    result = []
    head = 'db = DAL("mysql://'+ user+ ':'+passwd+'@'+host+':'+port+'/'+db+'", pool_size=10)\r\r'

    line = "db.define_table('"+table+"'"
    result.append(line)  
    for field in fields:
        if primarykey(field) == True:
            pk =field['Field']
            #print pk
        tipo = field_type(field)
        line = "    Field('"+field['Field']+"'"+tipo+")"
        result.append(line)
        line
    try:
        line = "    primarykey=['"+pk+"']"
        result.append(line)
    except:
        pass
    out = ',\r'.join(result)
    output = head + out + '\r)'
    print output
    return output

def define_db():
    tables = get_tables()
    r = []
    for table in tables:
        r.append(define_table(table))
    result = '\r \r'.join(r)
    return result

r = define_db()
f = open('db_'+db+'.py', 'w')
f.write(r)
f.close()

Reply via email to