| Viewing file:  dump.py (2.74 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
# Mimic the sqlite3 console shell's .dump command# Author: Paul Kippes <kippesp@gmail.com>
 
 # Every identifier in sql is quoted based on a comment in sqlite
 # documentation "SQLite adds new keywords from time to time when it
 # takes on new features. So to prevent your code from being broken by
 # future enhancements, you should normally quote any identifier that
 # is an English language word, even if you do not have to."
 
 def _iterdump(connection):
 """
 Returns an iterator to the dump of the database in an SQL text format.
 
 Used to produce an SQL dump of the database.  Useful to save an in-memory
 database for later restoration.  This function should not be called
 directly but instead called from the Connection method, iterdump().
 """
 
 cu = connection.cursor()
 yield('BEGIN TRANSACTION;')
 
 # sqlite_master table contains the SQL CREATE statements for the database.
 q = """
 SELECT "name", "type", "sql"
 FROM "sqlite_master"
 WHERE "sql" NOT NULL AND
 "type" == 'table'
 ORDER BY "name"
 """
 schema_res = cu.execute(q)
 for table_name, type, sql in schema_res.fetchall():
 if table_name == 'sqlite_sequence':
 yield('DELETE FROM "sqlite_sequence";')
 elif table_name == 'sqlite_stat1':
 yield('ANALYZE "sqlite_master";')
 elif table_name.startswith('sqlite_'):
 continue
 # NOTE: Virtual table support not implemented
 #elif sql.startswith('CREATE VIRTUAL TABLE'):
 #    qtable = table_name.replace("'", "''")
 #    yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"\
 #        "VALUES('table','{0}','{0}',0,'{1}');".format(
 #        qtable,
 #        sql.replace("''")))
 else:
 yield('%s;' % sql)
 
 # Build the insert statement for each row of the current table
 table_name_ident = table_name.replace('"', '""')
 res = cu.execute('PRAGMA table_info("{0}")'.format(table_name_ident))
 column_names = [str(table_info[1]) for table_info in res.fetchall()]
 q = """SELECT 'INSERT INTO "{0}" VALUES({1})' FROM "{0}";""".format(
 table_name_ident,
 ",".join("""'||quote("{0}")||'""".format(col.replace('"', '""')) for col in column_names))
 query_res = cu.execute(q)
 for row in query_res:
 yield("%s;" % row[0])
 
 # Now when the type is 'index', 'trigger', or 'view'
 q = """
 SELECT "name", "type", "sql"
 FROM "sqlite_master"
 WHERE "sql" NOT NULL AND
 "type" IN ('index', 'trigger', 'view')
 """
 schema_res = cu.execute(q)
 for name, type, sql in schema_res.fetchall():
 yield('%s;' % sql)
 
 yield('COMMIT;')
 
 |