Changes between Version 4 and Version 5 of DbDumpScript


Ignore:
Timestamp:
01/20/2007 02:31:36 AM (9 years ago)
Author:
limodou@…
Comment:

update to 1.3

Legend:

Unmodified
Added
Removed
Modified
  • DbDumpScript

    v4 v5  
    22
    33 * Author: limodou <limodou AT gmail.com>
    4  * Current Version: 1.2 2007-01-20
     4 * Current Version: 1.3 2007-01-20
    55
    66== Description ==
     
    9090# be saved as python source code, and you can import it.
    9191#
    92 # Version 1.2 2007-01-20
     92# Version 1.3 2007-01-20
     93#
    9394# Update 1.0 2007-01-18
    9495# Update 1.1 2007-01-19
     
    9798#    * change dumpdb to use model info but not cursor.description,
    9899#      because some database backend does not support cursor.description
     100#
     101# Update 1.3 2007-01-20
     102#    * change the output format of data file, and improve the process
     103#      effective of dumpping and loading
    99104#
    100105
     
    145150
    146151    datadir, verbose, stdout, remain = options.datadir, options.verbose, options.stdout, options.remain
    147     sql = 'INSERT INTO %s (%s) values (%s);'
     152    sql = 'INSERT INTO %s (%s) VALUES (%s);'
    148153
    149154    if isinstance(model, (tuple, list)):
     
    158163        print '..Dealing %s for %s format...\n' % (filename, format)
    159164    try:
    160         count = 0
     165        objs = {}
    161166        if format == 'py':
    162             basedir = os.path.dirname(filename)
    163             flag = False
    164             if sys.path.count(basedir) == 0:
    165                 sys.path.insert(0, basedir)
    166                 flag = True
    167             fname = os.path.splitext(os.path.basename(filename))[0]
    168             mod = __import__(fname, {}, {}, [''])
    169             objs = mod.dump
    170             if flag:
    171                 del sys.path[0]
     167            s = []
     168            f = file(filename, 'rb')
     169            for line in f:
     170                varname = line.split('=')[0]
     171                if varname.strip() != 'records':
     172                    s.append(line)
     173                else:
     174                    d = {}
     175                    exec ''.join(s) in d
     176                    objs['table'] = d.get('table', '')
     177                    objs['fields'] = d.get('fields', [])
     178                    objs['default'] = d.get('default', {})
     179                    objs['records'] = f
     180                    break
    172181        else:
    173             f = file(filename, 'r')
    174             objs = f.read()
    175             f.close()
     182#            f = file(filename, 'rb')
     183#            objs = f.read()
     184#            records = objs['records']
     185#            f.close()
     186            raise 'Not support this format %s' % format
    176187           
    177188        fs = objs['fields']
    178189        table = objs['table']
    179190       
    180         if not remain:
     191        if not remain and not stdout:
    181192            cursor.execute('DELETE FROM %s WHERE 1=1;' % backend.quote_name(table))
    182193           
    183194        default.update(objs.get('default', {}))
     195        count = 0
    184196        for row in objs["records"]:
     197            if row.strip() == ']':
     198                break
     199            row = eval(row)
    185200            d = dict(zip(fs, row))
    186201            sql_fields = []
     
    192207                else:
    193208                    if default.get(fd, None) is not None:
    194                         kind, value = default.get(fd)
     209                        kind, value = default[fd]
    195210                        if not kind or kind == 'value':
    196211                            v = value
     
    224239                try:
    225240                    cursor.execute(e_sql, sql_values)
     241                    count += 1
    226242                except:
    227243                    sys.stderr.write("Error sql: %s %s\n" % (e_sql, sql_values))
    228244                    raise
    229245        if verbose:
    230             print '(Total %d records)\n' % len(objs['records'])
     246            print '(Total %d records)\n' % count
    231247    except Exception, e:
    232248        import traceback
     
    286302        for model in get_models(app):
    287303            try:
    288                 result = dump_model(model)
    289                 write_result(result, format, options)
     304                write_result(dump_model(model), format, options)
    290305
    291306                for result in dump_many2many(model):
    292307                    write_result(result, format, options)
    293308            except Exception, e:
     309                import traceback
     310                traceback.print_exc()
    294311                sys.stderr.write("Unable to dump database: %s\n" % e)
    295312                errornum += 1
     
    308325    x = cursor.execute('select %s from %s' %
    309326        (','.join(map(backend.quote_name, fields)), backend.quote_name(opts.db_table)))
    310     return {'table':opts.db_table, 'fields':fields, 'records':_pre_data(x.fetchall())}
    311 
    312 def _pre_data(objs):
    313     for row in objs:
    314         for i, fd in enumerate(row):
    315             if isinstance(fd, datetime.datetime):
    316                 row[i] = row[i].strftime('%Y-%m-%d %H:%M:%S') # + '.' + str(row[i].microsecond).rstrip('0')
    317             elif isinstance(fd, datetime.date):
    318                 row[i] = row[i].strftime('%Y-%m-%d')
    319     return objs
     327    return call_cursor(opts.db_table, fields, x)
     328
     329def call_cursor(table, fields, cursor):
     330    yield table
     331    yield fields
     332    while 1:
     333        rows = cursor.fetchmany(100)
     334        if rows:
     335            for row in rows:
     336                yield _pre_data(row)
     337        else:
     338            break
     339
     340def _pre_data(row):
     341    for i, fd in enumerate(row):
     342        if isinstance(fd, datetime.datetime):
     343            row[i] = row[i].strftime('%Y-%m-%d %H:%M:%S') # + '.' + str(row[i].microsecond).rstrip('0')
     344        elif isinstance(fd, datetime.date):
     345            row[i] = row[i].strftime('%Y-%m-%d')
     346    return row
    320347
    321348def dump_many2many(model):
     
    327354        x = cursor.execute('select %s from %s' %
    328355            (','.join(map(backend.quote_name, fields)), backend.quote_name(table)))
    329         yield {'table':table, 'fields':fields, 'records':_pre_data(x.fetchall())}
     356        yield call_cursor(table, fields, x)
    330357
    331358def write_result(result, format, options):
    332     filename = os.path.join(options.datadir, result['table'] + '.%s' % format)
     359    table = result.next()
     360    fields = result.next()
     361    filename = os.path.join(options.datadir, table + '.%s' % format)
    333362    if options.verbose:
    334363        print '..Dumping %s ...\n' % filename
     
    337366    else:
    338367        f = sys.stdout
    339     print >>f, 'dump =', result, '\n'
     368    print >>f, 'table = %r' % table
     369    print >>f, 'fields = %r' % fields
     370    print >>f, 'records = ['
     371    i = 0
     372    for t in result:
     373        print >>f, repr(t)
     374        i += 1
     375    print >>f, ']'
    340376    if options.verbose:
    341         print '(Total %d records)\n' % len(result['records'])
     377        print '(Total %d records)\n' % i
    342378    if not options.stdout:
    343379        f.close()
Back to Top