1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#!/usr/bin/env python3
# -*- coding : utf-8 -*-
# Python 3
import sqlite3
import os
import csv
import configparser
import sys
class SQLiteCsvConvert:
'''
This class takes a database file and extract into CSV files.
One table equal one csv file
'''
def __init__(self, SQLiteDBfileName, myDialect='excel'):
'''
Initialise SQLiteloader Class
:param SQLiteDBfileName:
:param myDialect:
:return:
'''
self.myDialect = myDialect
self.__registerDialect()
if not os.path.isfile(SQLiteDBfileName):
# Créer un fichier base de données
raise IOError('No database exists')
sys.exit()
self.connect = sqlite3.connect(SQLiteDBfileName)
self.cursor = self.connect.cursor()
self.cursor.execute('PRAGMA encoding="UTF-8";')
def __registerDialect(self):
'''
Add other dialects for CSV Writer.
'escaped', 'singlequote', 'excel-fr', 'unix-pwd'
By default CSV Writer have excel, excel-tabs, and unix dialects
:param:
:return:
'''
csv.register_dialect('escaped',
escapechar='\\',
doublequote=False,
quoting=csv.QUOTE_NONE)
csv.register_dialect('singlequote',
quotechar="'",
quoting=csv.QUOTE_ALL)
csv.register_dialect('excel-fr',
delimiter=';', quotechar='"', doublequote = 1,
escapechar=None, skipinitialspace = 0, quoting=csv.QUOTE_ALL,
lineterminator='\r\n')
csv.register_dialect('unix-pwd', delimiter=':',
quotechar=None, lineterminator='\r')
def executeRequest(self, statement):
'''
Use generator to request datas
:param statement:
:return: Generator
'''
try:
result = self.cursor.execute(statement)
for i in result:
yield i
except:
self.connect.rollback()
print("Erreur")
self.connect.commit()
def executeCommand(self, statement):
'''
Execute any SQL Command as CREATE/DROP/ALTER TABLE or DELETE... on
database and close connection
:param statement:
:return: None
'''
try:
self.cursor.execute(statement)
except:
self.connect.rollback()
print("Erreur")
self.connect.commit()
def extractDBtable(self):
'''
Extract all Table's name from database
:param:
:return:
'''
try:
statement = 'SELECT name FROM sqlite_master WHERE type="table";'
tableList = tuple()
for r in self.executeRequest(statement):
tableList += r
return tableList
except Exception as e:
raise e
def extractFields(self, tableName, detail=False):
'''
Extract fields in a selected table from database
:param tableName:
:param tableName:
:return fieldsList:
'''
statement = 'PRAGMA TABLE_INFO({})'.format(tableName)
fieldsList = []
r = self.executeRequest(statement)
for i in r:
if detail:
fieldsList += i
# Return all informations about fields (name, type, ...)
fieldsList.append(i[1:])
else:
# Return only the name of fields
fieldsList.append(i[1])
return fieldsList
def extractTabletoCSV(self, tableName, myFile):
'''
Extract one table from database to CSV file
:param tableName:
:param myFile:
:return:
'''
statement = 'SELECT * FROM %s' % (tableName)
#myTable = self.cursor.execute(statement)
try:
f = open(myFile, 'w', encoding="utf-8")
writer = csv.writer(f, self.myDialect)
temp = self.extractFields(tableName, detail=False)
writer.writerow(temp[1:])
for temp in self.executeRequest(statement):
writer.writerow(temp[1:])
f.close()
except FileExistsError:
print("Le fichier existe déjà")
def extractDBtoCSV(self):
'''
Extract all tables from database to CSV files
:return:
'''
extract = self.extractDBtable()
for table in extract:
self.extractTabletoCSV(table, str(table)+'.csv', self.myDialect)
def close(self):
self.connect.close()
print('Connection Closed') |
Partager