Would you post a slice about this? On Dec 17, 5:13 pm, villas <[email protected]> wrote: > Just for anyone searching and finding this thread. I started working > with the link given by Massimo and ended up with this. > It's very ugly and unsupported by me or anyone else. However, it > converted my basic Firebird schema and it just might help save someone > else a little bit of time. I don't know about other DBs and I cannot > help anyone who gets stuck! > > use like this > #auto.py schema.sql > modelcontroller.py > > ------------------ auto.py script ----------------- > import re > import sys > > regex_tables=re.compile("""^[\w]+\.define_table\(\s*[\'\"](?P<name> > [\w_]+)[\'\"]""",flags=re.M) > > conversion={ > 'references':"'integer'", > 'clob':"'text'", > 'varchar':"'string'", > 'char':"'string'", > 'int':"'integer'", > 'int4':"'integer'", > 'bool':"'boolean'", > 'float':"'double'", > 'date':"'date'", > 'datetime':"'datetime'", > 'timestamp':"'datetime'", > 'time':"'datetime'", #populate doesn't accept time, needs fixing > 'decimal':"'decimal(9,2)'", > 'numeric':"'decimal(9,2)'", > 'blob':"'text'", > 'double':"'double'", > 'defaultno':"'string', length=1, default='N'", #ignore, personal > domain > 'yesno':"'boolean'", #ignore, personal domain > 'amount':"'decimal(9,2)'", #ignore, personal domain > 'sys_id':"'integer'" #ignore, personal domain > > } > > def convert(field): > for k in conversion.iterkeys(): > field = field.lower() > if field.find(k) >=0: > outstr = conversion[k] > if (outstr == "'string'") & (field.find('(')>=0) : > lafield = field.split('(') > lslen = re.search('(?P<group>[\d]+)',lafield[1]) > return outstr+', length='+lslen.group(0) > else: return outstr > return field > > def auto(data): > regex1=re.compile('\s*(?P<name>\S+\s+\S+).*') > data = re.sub('[\f\n\r\t\v\[\]]', '', data).lower() > data = re.sub(' id ', ' id_prev ', data) > data = re.sub(' keys ', ' keyregister ', data) > data = re.sub(' status ', ' stat ', data) > tables={} > output='' > for item in re.compile('create\s+table\s+(?P<tablename>\S+)(? > P<fields>.*?\);)').findall(data): > tablename=item[0] > fields=item[1].lower() > while (fields[0:1] == ' ') | (fields[0:1] == '(') : > fields=fields[1:] > fields2=[regex1.match(i).group('name').split() for i in > fields.split(', ')] > lastfieldtuple = fields2[-1:] > if lastfieldtuple[0][0] == 'constraint' : fields2 = fields2 > [:-1] > > sfields=''.join(["db.Field('%s',%s),\n " % (k,convert(v)) > for k,v in fields2 if not k.upper() in ['INDEX','CONSTRAINT']]) > output+="db.define_table('%s',\n %smigrate='%s.mig')\n" % > (tablename, sfields, tablename) > tables[tablename]=[k for k,v in fields2] > labels=','.join(["'%s':T('%s')"%(f,f) for f in tables > [tablename]]) > output+='%s_labels={%s}\n\n' % (tablename,labels) > tablenames=tables.keys() > tablenames.sort() > output += '\n\nfrom gluon.contrib.populate import populate\n' > # populates the tables > for tablename in tablenames: > output += 'if not db(db.%(table)s.id).count(): populate(db.% > (table)s,5)\n'% dict(table=tablename) > model = output > > # Returns a URL to link to in crud.selects. > output = """ > def mylink(field, type, ref): > return URL(r=request, args=[field]) > """ > for tablename in tablenames: > output += """ > > def %(table)s(): > # Maintain all the table_name records in the application > # Manage, list, create and update projects. > > # SELECT if no args > if len(request.args)<1: > return dict(form=crud.select(db.%(table)s,linkto=mylink)) > > # If 1 arg and it is 'create' then CREATE > elif len(request.args)==1 and request.args[0]=='create': > return dict(form=crud.create(db.%(table)s,next=URL > (request.application,request.controller,%(table)s))) > > # If 1 arg and its integer, EDIT it. > elif len(request.args)==1: > try: > i=int(request.args[0]) > except: > redirect(URL(r=request,f='index')) > return dict(form=crud.update(db.%(table)s,i,next=URL > (request.application,request.controller,%(table)s))) > else: > redirect(URL(r=request,f='index')) > > """ % dict(table=tablename,fields=tables[tablename]) > controller=output > > return '# MODEL\n'+model+'# CONTROLLER\n'+controller > > if __name__=='__main__': > print auto(open(sys.argv[1],'r').read())
-- You received this message because you are subscribed to the Google Groups "web2py-users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/web2py?hl=en.

