Path: csiph.com!usenet.pasdenom.info!aioe.org!news.stack.nl!newsfeed.xs4all.nl!newsfeed2.news.xs4all.nl!xs4all!newsgate.cistron.nl!newsgate.news.xs4all.nl!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'else:': 0.03; 'value,': 0.04; 'warnings': 0.04; 'yet.': 0.04; 'argument': 0.05; 'elif': 0.05; 'insert': 0.05; '#if': 0.07; 'column': 0.07; 'currency': 0.07; 'failing': 0.07; 'filename:fname piece:py': 0.07; 'finally:': 0.07; 'float': 0.07; 'mysql,': 0.07; 'none:': 0.07; 'skip:` 10': 0.07; 'skip:l 60': 0.07; 'sys': 0.07; 'versions,': 0.07; '"__main__":': 0.09; '#print': 0.09; '__init__': 0.09; '__name__': 0.09; 'arguments': 0.09; 'arguments,': 0.09; 'executable': 0.09; 'f.close()': 0.09; 'function,': 0.09; 'insertion': 0.09; 'skip:# 30': 0.09; 'statements': 0.09; 'testing,': 0.09; 'try:': 0.09; 'cc:addr:python-list': 0.11; 'def': 0.12; 'jan': 0.12; '"":': 0.16; '"#":': 0.16; '")"': 0.16; '"-"': 0.16; '"0"': 0.16; '"["': 0.16; '"\\r\\n"': 0.16; '"about': 0.16; '"create': 0.16; '"insert': 0.16; '"w")': 0.16; '"|"': 0.16; '("",': 0.16; '.py': 0.16; '10:59': 0.16; 'bool': 0.16; 'bytearray': 0.16; 'col': 0.16; 'columns': 0.16; 'currency,': 0.16; 'exc_type,': 0.16; 'integer,': 0.16; 'itself,': 0.16; 'jacob': 0.16; 'received:opentransfer.com': 0.16; 'script,': 0.16; 'skip:\\ 30': 0.16; 'skip:{ 30': 0.16; 'tab': 0.16; 'true:': 0.16; 'unicode,': 0.16; 'value"': 0.16; 'varies': 0.16; '{0}': 0.16; '{1},': 0.16; 'exception': 0.16; 'files.': 0.16; 'skip:# 20': 0.16; 'thursday,': 0.16; 'ignore': 0.16; 'wrote:': 0.18; 'bit': 0.19; 'file,': 0.19; 'passing': 0.19; 'skip:f 30': 0.19; 'thu,': 0.19; 'written': 0.21; 'command': 0.22; 'machine': 0.22; 'select': 0.22; 'import': 0.22; 'issue.': 0.22; 'cc:addr:python.org': 0.22; 'error': 0.23; 'byte': 0.24; 'driver': 0.24; 'exists': 0.24; 'integer': 0.24; "shouldn't": 0.24; 'skip:l 30': 0.24; 'unicode': 0.24; 'versions': 0.24; 'file.': 0.24; 'cc:2**0': 0.24; 'cc:no real name:2**0': 0.24; 'sort': 0.25; 'source': 0.25; '15,': 0.26; 'query': 0.26; 'pass': 0.26; 'post': 0.26; 'primary': 0.26; 'skip:" 20': 0.27; 'values': 0.27; 'header:In-Reply-To:1': 0.27; 'tried': 0.27; 'function': 0.29; 'skip:p 30': 0.29; 'character': 0.29; 'database,': 0.30; 'errors': 0.30; 'skip:( 20': 0.30; 'code': 0.31; 'lines': 0.31; '"")': 0.31; 'decimal': 0.31; 'indentation': 0.31; 'os,': 0.31; 'pickle': 0.31; 'requesting': 0.31; 'tuples': 0.31; 'file': 0.32; 'class': 0.32; 'lists': 0.32; 'run': 0.32; 'text': 0.33; 'running': 0.33; '-----': 0.33; 'skip:# 10': 0.33; 'table': 0.34; 'minutes': 0.67; 'close': 0.67; 'skip:w 30': 0.69; 'results': 0.69; 'default': 0.69; 'ending': 0.78; '(sql': 0.84; '2015': 0.84; 'effectively,': 0.84; 'float,': 0.84; 'initiates': 0.84; 'no:': 0.84; 'relate': 0.84 Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=blindza.co.za; s=dkim-shared; x=1421945070; h=Comment: DomainKey-Signature:Received:Received:Message-ID:From:To:Cc: References:In-Reply-To:Subject:Date:MIME-Version:Content-Type; bh=SZYv4nMuo4hBj0P3jGbgP7e+hhS4JoctIEc+mkTfSsE=; b=qn3lhm/O8PUiD rptz8PFZFvdpWy13eS0JZWfstT/qO65XCn63fPZlpr/vF41wI8QNONn+2+9s3kbg RNXdKGpcYK4SieWALLA6+KDSljXHkeAOOdYd2TPJ17pVI1MGV9HmCgdR3yu6HDhC AylErE9CsxytJsXerDMso2Lo2VOFWA= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=dkim-shared; d=blindza.co.za; h=Received:Received:X-Originating-IP:Message-ID:From:To:Cc:References:In-Reply-To:Subject:Date:MIME-Version:Content-Type:X-Priority:X-MSMail-Priority:X-Mailer:X-Mimeole; b=mp59YN90eyoBjBKPaXH3CYzlA7DrnUsBEqehWwMDmuvh9m3J0mVHNHVO0ei1c0 ZYXN46xUjIwapWeYO5IqtH0oQbPDNx7CzZmko4LCiIacvn0Rm40BcRub6LmcItTp 5fC7Tv2nCtYUxDZgpP2YI3gCHnifUHzFthItD94WpZ+o8=; X-Originating-IP: 105.237.17.61 From: "Jacob Kruger" To: "Chris Angelico" References: <5F6F0C3BBA694C15A513F94735D89E18@JakesPC> In-Reply-To: Subject: Re: MySQL connections Date: Thu, 15 Jan 2015 18:40:31 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0040_01D030F2.BDD6E360" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6002.18197 X-Mimeole: Produced By Microsoft MimeOLE V6.1.7601.17609 Cc: python-list@python.org X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 594 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1421340275 news.xs4all.nl 2855 [2001:888:2000:d::a6]:40630 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:83834 This is a multi-part message in MIME format. ------=_NextPart_000_0040_01D030F2.BDD6E360 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit ----- Original Message ----- From: "Chris Angelico" Cc: Sent: Thursday, January 15, 2015 2:33 PM Subject: Re: MySQL connections > On Thu, Jan 15, 2015 at 10:59 PM, Jacob Kruger > wrote: >> Tried generating .exe with both cx_freeze, and pyInstaller, and the code >> itself, and both versions of executable generate errors, same as running >> it >> from command line - only difference is the source of the error mentioned >> in >> error message then varies from a2m.exe and python.exe , and even if >> compile >> it on machine where all works, and then copy .exe back to this primary >> machine, then get same error - think it must relate to something else on >> this machine, but can't track it down. > > Okay. Ignore the .exe versions, and just work with what happens when > you run the .py files. If it fails as part of a .py file, post the > failing file. If you want to check it out, have attached the full code file - might be a bit messy/large - but, effectively, right at bottom, launch an instance of the class a2m, passing through arguments, and then from within __init__ call convertProcess function, which then initiates process, harvesting sort of rendition/version of structure out of MS access database file, makes call to convertSQL to generate structural SQL script, and save it to a file, which then calls convertData function to generate insert statements to populate database, and then that makes a call to convertExport, if you passed a command line argument in requesting mysql, and that's the current issue function - have stripped most of actual functionality out of it, since am just testing, so the first 16 lines of that function are what's relevant at moment - think shouldn't rely on any other self. objects/attributes as such either, unless step-through process is an issue. And, tried cleaning it up a bit - replaced tab indentation character with double spaces, but, code might not look perfect/be perfectly clean as of yet. Jacob Kruger Blind Biker Skype: BlindZA "Roger Wilco wants to welcome you...to the space janitor's closet..." ------=_NextPart_000_0040_01D030F2.BDD6E360 Content-Type: text/plain; format=flowed; name="a2m.py"; reply-type=original Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="a2m.py" import pypyodbc, os, sys import copy, warnings import pymysql, time, pickle from unidecode import unidecode def sTimeDiffFormat(i_time1, i_time2): i_total_time =3D i_time2 - i_time1 if i_time2 > i_time1 else i_time1 - = i_time2 i_total_time =3D int(i_total_time) #time.strftime("%H:%M:%S", time.gmtime(i_total_time)) i_hours =3D 0 i_minutes =3D 0 if i_total_time >=3D 3600: i_hours =3D int(i_total_time / 3600) i_total_time =3D i_total_time - (i_hours * 3600) if i_total_time > 60: i_minutes =3D int(i_total_time/60) i_total_time =3D i_total_time - (i_minutes * 60) s_out =3D "" if i_hours > 0: s_out =3D "{0} hours ".format(i_hours) if i_minutes > 0: s_out =3D s_out + "{0} minutes ".format(i_minutes) s_out =3D s_out + "{0} seconds".format(i_total_time) return s_out #end of sTimeDiffFormat class a2m(): s_mdb =3D "" s_mdb_pass =3D "" s_mdb_conn =3D "" bl_mdb_conn =3D False d_db_tables =3D {} cn_mdb =3D None s_structure_sql =3D "" d_db_data =3D {} l_field_types =3D [] s_target =3D "" s_target_value =3D "" s_sql_struct_file =3D "" s_sql_data_file =3D "" =20 def __init__(self, s_mdb, s_mdb_pass, s_target, s_target_value): self.s_mdb =3D str(s_mdb) if len(str(s_mdb)) > 0 else "" self.s_mdb_pass =3D str(s_mdb_pass) if len(str(s_mdb_pass)) > 0 else = "" if self.s_mdb_pass =3D=3D "#": self.s_mdb_pass =3D "" self.s_target =3D str(s_target) if len(str(s_target))>0 else "" self.s_target_value =3D str(s_target_value) if = len(str(s_target_value))>0 else "" self.s_mdb_conn =3D "" self.bl_mdb_conn =3D False if self.s_mdb !=3D "" and self.s_target !=3D "" and = self.s_target_value !=3D "": self.convertProcess() #end of __init__ =20 def shiftID(self, l_columns): if l_columns.count("ID")>0: l_columns.remove("ID") l_columns.insert(0, "ID") return l_columns #end of shiftID def dictDBStructure(self, cur): d_out =3D {} cur_tables =3D cur.tables(tableType=3D"table").fetchall() s_tables =3D "" for l_table in cur_tables: s_tables +=3D str(l_table[2]) + "|" l_tables =3D s_tables.split("|") if len(l_tables) > 1: l_tables.pop(len(l_tables)-1) for s_table in l_tables: d_out[s_table] =3D {} #s_columns =3D "" #INTEGER, SMALLINT, VARCHAR, LONGCHAR, CURRENCY, BIT, DATETIME, = COUNTER? for col in cur.columns(table=3Ds_table): s_col_name =3D str(col.get("column_name")) s_col_type =3D str(col.get("type_name")) i_col_size =3D int(col.get("column_size")) if list(d_out[s_table].keys()).count(s_col_name) < 1: d_out[s_table][s_col_name] =3D {"column_name": s_col_name, = "column_type": s_col_type, "column_size": i_col_size} return d_out #end of dictDBStructure def pullDataTypes(self, evt): if len(self.s_mdb) > 0: s_path =3D self.s_mdb s_pwd =3D self.DialogInput(title=3D"Password", label=3D"Password = (if required):", value=3D"") if len(s_pwd) > 0: s_pwd =3D " pwd=3D{0};".format(s_pwd) self.s_mdb_conn =3D "Driver=3DMicrosoft Access Driver (*.mdb, = *.accdb);" + s_pwd + " DBQ=3D" + s_path try: self.cn_mdb =3D pypyodbc.connect(self.s_mdb_conn) self.bl_mdb_conn =3D True cur =3D self.cn_mdb.cursor() self.d_db_tables =3D self.dictDBStructure(cur) #field_name-pypyodbcType-python valueType #--- #ID - COUNTER - int #text_one - VARCHAR - unicode #double_one - DOUBLE - float #byte_one - BYTE - int #real_one - DECIMAL - #longbinary_one - LONGBINARY - bytearray #int_one - INTEGER - int #smallint_one - SMALLINT - int #decimal_one - DECIMAL - #currency_one - CURRENCY - #datetime_one - DATETIME - datetime.datetime #memo_one - LONGCHAR - unicode #yes_no_one - BIT - bool #hyperlink_one - LONGCHAR - unicode #lookup_one - VARCHAR - unicode #for insertion/update via pypyodbc.cursor.execute - = pypyodbc.binary(data) l_types =3D [] for s_table in self.d_db_tables.keys(): for s_column in self.d_db_tables[s_table].keys(): if = l_types.count(self.d_db_tables[s_table][s_column]["column_type"]) < 1: = l_types.append(self.d_db_tables[s_table][s_column]["column_type"]) s_types =3D str(l_types).replace("[", "").replace("]", = "").replace(", ", "\n").replace("'", "") self.DialogShow(title=3D"column types", message=3Ds_types) self.cn_mdb.close() self.bl_mdb_conn =3D False except Exception as exc: s_exc =3D str(exc.args) exc_type, exc_obj, tb =3D sys.exc_info() s_exc +=3D "lineNo: " + str(tb.tb_lineno) s_exc +=3D str(exc_obj) self.DialogShow("exception", message=3Ds_exc) #end of pullDataTypes =20 def convertProcess(self): self.s_mdb =3D str(os.path.realpath(self.s_mdb)) self.d_db_tables =3D {} if len(self.s_mdb) > 0: s_path =3D self.s_mdb s_pwd =3D self.s_mdb_pass if len(s_pwd) > 0: s_pwd =3D " pwd=3D{0};".format(s_pwd) self.s_mdb_conn =3D "Driver=3DMicrosoft Access Driver (*.mdb, = *.accdb);" + str(s_pwd) + " DBQ=3D" + str(s_path) try: self.cn_mdb =3D pypyodbc.connect(self.s_mdb_conn) self.bl_mdb_conn =3D True cur =3D self.cn_mdb.cursor() #self.d_db_tables =3D self.addColumnDBStructure(cur) #self.d_db_tables =3D self.classedDBStructure(cur) self.d_db_tables =3D self.dictDBStructure(cur) if len(self.d_db_tables) > 0: for s in self.d_db_tables.keys(): pass #print(s + ": " + str(self.d_db_tables[s].keys())) print("table count: " + str(len(self.d_db_tables))) s_out =3D "" for s_table in list(self.d_db_tables.keys()): s_out +=3D "[" + s_table + "]\r\n---\r\n" s_out +=3D str(list(self.d_db_tables[s_table].keys())) + = "\r\n---\r\n" for s_col in list(self.d_db_tables[s_table].keys()): d_col =3D self.d_db_tables[s_table][s_col] s_out +=3D s_col + "\t" + d_col["column_type"] if d_col["column_size"] !=3D 0: s_out +=3D " (" + = str(d_col["column_size"]) + ")" s_out +=3D "\r\n" s_out +=3D "---\r\n" f =3D open(self.s_target_value + ".txt", "w") f.write(s_out) f.close() print(self.s_target_value + ".txt info file written") cur.close() self.cn_mdb.close() self.bl_mdb_conn =3D False self.convertSQL() except Exception as exc: s_exc =3D str(exc.args) exc_type, exc_obj, tb =3D sys.exc_info() s_exc +=3D "\nline no: " + str(tb.tb_lineno) #lbc.DialogShow(title=3D"errorMessage", message=3Ds_exc) print(s_exc) else: print("missing .mdb/.sdb file") return None #sys.exit() #end of convertProcess function =20 def convertSQL(self): try: if len(self.d_db_tables) > 0: s_table_sql =3D "DROP TABLE IF EXISTS `#table#`;\n" s_table_sql +=3D "CREATE TABLE `#table#` (\r\n#fields##index#" #s_table_index_sql =3D "INDEX (`#id#`),\r\n PRIMARY KEY = (`#id#`)" s_table_index_sql =3D "INDEX (`#id#`)" s_table_sql +=3D ") ENGINE=3DInnoDB DEFAULT CHARSET=3Dutf8;\r\n" s_tables_sql =3D "" for s_table in self.d_db_tables.keys(): s_id =3D "" d_each_table =3D self.d_db_tables[s_table] #re-order columns to put id/counter first l_table_columns =3D list(d_each_table.keys()) #l_columns =3D [] l_table_columns =3D self.shiftID(l_table_columns) s_fields_sql =3D "" for s_col in l_table_columns: d_col =3D self.d_db_tables[s_table][s_col] #INTEGER, SMALLINT, VARCHAR, LONGCHAR, CURRENCY, BIT, = DATETIME, COUNTER? if d_col["column_type"] =3D=3D "COUNTER": s_fields_sql =3D s_fields_sql + "`{0}` INTEGER NOT NULL = AUTO_INCREMENT, \r\n".format(d_col["column_name"]) if s_id =3D=3D "": s_id =3D d_col["column_name"] elif d_col["column_type"]=3D=3D"INTEGER": #int s_fields_sql =3D s_fields_sql + "`{0}` INTEGER, = \r\n".format(d_col["column_name"]) elif d_col["column_type"]=3D=3D"SMALLINT": #int16 s_fields_sql =3D s_fields_sql + "`{0}` SMALLINT, = \r\n".format(d_col["column_name"]) elif d_col["column_type"]=3D=3D"BYTE": #bigint s_fields_sql =3D s_fields_sql + "`{0}` BIGINT, = \r\n".format(d_col["column_name"]) elif d_col["column_type"] =3D=3D "VARCHAR": s_fields_sql =3D s_fields_sql + "`{0}` VARCHAR ({1}), = \r\n".format(d_col["column_name"], str(d_col["column_size"])) elif d_col["column_type"] =3D=3D "LONGCHAR": #longtext s_fields_sql =3D s_fields_sql + "`{0}` LONGTEXT, = \r\n".format(d_col["column_name"]) elif d_col["column_type"] =3D=3D "DATETIME": #datetime s_fields_sql =3D s_fields_sql + "`{0}` DATETIME, = \r\n".format(d_col["column_name"]) elif d_col["column_type"] =3D=3D "CURRENCY" or = d_col["column_type"] =3D=3D "REAL": #float s_fields_sql =3D s_fields_sql + "`{0}` FLOAT, = \r\n".format(d_col["column_name"]) elif d_col["column_type"] =3D=3D "BIT": #bit s_fields_sql =3D s_fields_sql + "`{0}` BIT, = \r\n".format(d_col["column_name"]) elif d_col["column_type"] =3D=3D "LONGBINARY": #longblob s_fields_sql =3D s_fields_sql + "`{0}` LONGBLOB, = \r\n".format(d_col["column_name"]) else: #others? s_fields_sql =3D s_fields_sql + "`{0}` {1}, = \r\n".format(d_col["column_name"], d_col["column_type"]) #s_fields_sql =3D s_fields_sql[:len(s_fields_sql)-4] if s_id !=3D "": s_tables_sql =3D s_tables_sql + = s_table_sql.replace("#table#", s_table).replace("#fields#", = s_fields_sql).replace("#index#", s_table_index_sql.replace("#id#", = s_id)) + "\r\n" else: s_tables_sql =3D s_tables_sql + = s_table_sql.replace("#table#", s_table).replace("#fields#", = s_fields_sql[:-4]).replace("#index#", "") + "\r\n" self.s_sql_struct_file =3D self.s_target_value + "SQL.txt" f =3D open(self.s_sql_struct_file, "w") f.write(s_tables_sql) f.close() self.s_structure_sql =3D s_tables_sql print("Structure SQL written to " + self.s_sql_struct_file) self.convertData() else: print("Nothing to work with - No table structures to process") except Exception as exc: s_exc =3D str(exc.args) exc_type, exc_obj, tb =3D sys.exc_info() s_exc +=3D "\nline no: " + str(tb.tb_lineno) #lbc.DialogShow(title=3D"errorMessage", message=3Ds_exc) print(s_exc) #end of convertSQL function =20 def sRowInsertSQL(self, s_table, s_columns, l_data): s_busy =3D "" s_col_name =3D "" s_val_type =3D "" try: s_out =3D "" l_columns =3D s_columns.replace("[", "").replace("]", "").split(", = ") #l_data is a list of tuples that contain actual data for J in range(len(l_data)): s_fields =3D "" s_values =3D "" for I in range(len(l_columns)): d_col =3D self.d_db_tables[s_table][l_columns[I]] s_busy =3D "about to retrieve column name" s_fields +=3D "`" + d_col["column_name"] + "`, " s_col_name =3D d_col["column_name"] #field_name-pypyodbcType-python valueType #--- #ID - COUNTER - int #text_one - VARCHAR - unicode #double_one - DOUBLE - float #byte_one - BYTE - int #real_one - DECIMAL - #longbinary_one - LONGBBLOB - bytearray #int_one - INTEGER - int #smallint_one - SMALLINT - int #decimal_one - DECIMAL - #currency_one - CURRENCY - #datetime_one - DATETIME - datetime.datetime #memo_one - LONGCHAR - unicode #yes_no_one - BIT - bool #hyperlink_one - LONGCHAR - unicode #lookup_one - VARCHAR - unicode #for insertion/update via pypyodbc.cursor.execute - = pypyodbc.binary(data) if d_col["column_type"] in ("VARCHAR", "LONGCHAR", "CHAR"): s_busy =3D "about to retrieve text type data value" s_val =3D unidecode(l_data[J][I]) if l_data[J][I] !=3D None = else "" if s_val =3D=3D None: s_val =3D "" s_val_type =3D str(type(s_val)) if self.l_field_types.count(s_val_type) < 1: = self.l_field_types.append(s_val_type) s_busy =3D "about to unicode.decode it if unicode, or else = just str datetime" #'abc'.decode('utf-8') # str to unicode #u'abc'.encode('utf-8') # unicode to str s_busy =3D "about to add it to s_values" s_values +=3D "'" + s_val.replace("\\", "\\\\").replace("'", = chr(92) + "'").replace("\"", chr(92) + "\"").replace(";", "") + "', " elif d_col["column_type"] =3D=3D "DATETIME": s_busy =3D "about to retrieve datetime type data value" s_val =3D str(l_data[J][I]) if l_data[J][I] !=3D None else = "" s_val =3D unidecode(s_val) if l_data[J][I] !=3D None else "" if s_val =3D=3D None: s_val =3D "" s_val_type =3D str(type(s_val)) if self.l_field_types.count(s_val_type) < 1: = self.l_field_types.append(s_val_type) s_busy =3D "about to unicode.decode it if unicode, or else = just str datetime" #'abc'.decode('utf-8') # str to unicode #u'abc'.encode('utf-8') # unicode to str s_busy =3D "about to add it to s_values" if s_val =3D=3D "None" or s_val =3D=3D "": s_values +=3D "NULL, " else: s_values +=3D "'" + s_val.replace("\\", = "\\\\").replace("'", chr(92) + "'").replace("\"", chr(92) + = "\"").replace(";", "") + "', " elif d_col["column_type"] in ("INTEGER", "SMALLINT", = "COUNTER", "BYTE"): s_busy =3D "about to add int value" s_val =3D unidecode(u"" + str(l_data[J][I])) if l_data[J][I] = !=3D None else "0" s_values +=3D s_val + ", " elif d_col["column_type"] in ("CURRENCY", "DECIMAL", = "DOUBLE", "REAL"): s_busy =3D "about to add float value" s_val =3D l_data[J][I] s_val =3D unidecode(s_val) f_val =3D 0.0 if s_val in ("", "None") else float(s_val) s_values +=3D unidecode(f_val) + ", " elif d_col["column_type"] =3D=3D "BIT": s_busy =3D "about to add bit value " + = str(l_data[J][I]).lower() s_val =3D u"1" if l_data[J][I] else u"0" s_val =3D unidecode(s_val).lower() s_val =3D "1" if s_val =3D=3D "true" else "0" s_values +=3D s_val + ", " elif d_col["column_type"] =3D=3D "LONGBINARY": s_busy =3D "about to add longbinary value..." s_values +=3D "0x" + = str(l_data[J][I]).encode("hex").replace("\\", "\\\\") + ", " else: print("big shiznit: " + str(d_col["column_name"]) + "-" + = str(d_col["column_type"])) #remove ending ', ' at end of fields and values s_fields =3D s_fields[:-2] if len(s_fields) > 2 else "" s_values =3D s_values[:-2] if len(s_values) > 2 else "" s_out +=3D "INSERT INTO `{0}` ({1}) values = ({2});\n".format(s_table, s_fields, s_values) return s_out except Exception as exc: print(str(exc.args)) exc_type, exc_obj, tb =3D sys.exc_info() print("lineNo: " + str(tb.tb_lineno)) print(str(exc_obj)) print("busy with: " + s_busy + "\ntable: " + s_table + "\ncolumn = name: " + s_col_name + "\nvalue type: " + s_val_type) #sys.exit() return "" #end of sRowInsertSQL =20 def convertData(self): try: if len(self.d_db_tables) > 0: if not self.bl_mdb_conn: self.cn_mdb =3D pypyodbc.connect(self.s_mdb_conn) self.bl_mdb_conn =3D True s_data_sql =3D "" cur =3D self.cn_mdb.cursor() s_out =3D "" for s_table in self.d_db_tables.keys(): d_columns =3D self.d_db_tables[s_table] #read data into recursive lists l_table_columns =3D list(d_columns.keys()) #INTEGER, SMALLINT, VARCHAR, LONGCHAR, CURRENCY, BIT, = DATETIME, COUNTER? l_table_columns =3D self.shiftID(l_table_columns) s_columns =3D "[" + str(l_table_columns).replace("[", = "").replace("]", "").replace("'", "").replace(", ", "], [") + "]" #print ("SQL select statement: " + "select " + s_columns + " = from " + s_table + ";") cur_rows =3D cur.execute("select " + s_columns + " from " + = s_table + ";") cur_data =3D cur_rows.fetchall() #self.d_db_data[s_table] =3D copy.copy(cur_data) self.d_db_data[s_table] =3D cur_data if len(self.d_db_data[s_table])>0: #print("about to call sRowInsertSQL func") s_data_sql +=3D self.sRowInsertSQL(s_table, s_columns, = self.d_db_data[s_table]) #cur_rows.close() if len(s_data_sql)>0: self.s_sql_data_file =3D self.s_target_value + "SQLData.txt" f =3D open(self.s_sql_data_file, "w") f.write(s_data_sql) f.close() f =3D open(self.s_target_value + "FieldDataTypes.txt", "w") f.write(str(self.l_field_types)) f.close() print("Data SQL statements for data insertion written to " + = self.s_sql_data_file + ", and " + self.s_target_value + = "FieldDataTypes.txt has all field types in it") self.cn_mdb.close() self.bl_mdb_conn =3D False if self.s_target=3D=3D"mysql": warnings.simplefilter("ignore") self.convertExport() warnings.simplefilter("default") else: print("Done!") #sys.exit() return None else: print("Data issue - Nothing to work with") except Exception as exc: s_exc =3D str(exc.args) exc_type, exc_obj, tb =3D sys.exc_info() s_exc +=3D "\nline no: " + str(tb.tb_lineno) #lbc.DialogShow(title=3D"errorMessage", message=3Ds_exc) print(s_exc) exc_type, exc_obj, tb =3D sys.exc_info() print("line number: " + str(tb.tb_lineno)) #end of convertData function =20 def convertExport(self): try: f_mysql =3D open("mysql.set", "rb") d_mysql =3D pickle.load(f_mysql) f_mysql.close() cn =3D None s_host =3D str(d_mysql["host"]) s_user =3D str(d_mysql["user"]) s_pass =3D str(d_mysql["password"]) s_db =3D self.s_target_value cn =3D pymysql.connect(s_host, s_user, s_pass, s_db) #cn.autocommit(True) time.sleep(5) print("about to close cn") try: cn.close() except Exception as exc: print("closing exc: " + str(exc)) finally: sNada =3D input(".....") #time.sleep(10) print("closed") sys.exit() #if cn: if True: l_struct_errors =3D [] l_data_errors =3D [] i_struct =3D 0 i_data =3D 0 l_struct =3D [] l_data =3D [] s_time_taken =3D "aeons!" #cn.close() fPickle =3D open("testDataErrors.pickle", "wb") pickle.dump(l_struct_errors, fPickle, 2) pickle.dump(l_data_errors, fPickle, 2) fPickle.close() print("MySQL Results - {0} structure queries, and {1} data = queries completed - total of {2}".format(str(len(l_struct)), = str(len(l_data)), s_time_taken)) print("MySQL Errors - {0} structure query errors, and {1} data = query errors".format(str(len(l_struct_errors)), = str(len(l_data_errors)))) print("Done!") #sys.exit() return None else: print("Connection issue - There was a problem connecting to = MySQL server") #sys.exit() return None except Exception as exc: s_exc =3D str(exc.args) exc_type, exc_obj, tb =3D sys.exc_info() s_exc +=3D "\nline no: " + str(tb.tb_lineno) #lbc.DialogShow(title=3D"errorMessage", message=3Ds_exc) print(s_exc) exc_type, exc_obj, tb =3D sys.exc_info() print(str(exc_obj)) print("line number: " + str(tb.tb_lineno)) #end of convertExport function #end of a2m class if __name__ =3D=3D "__main__": if len(sys.argv) >=3D 5: s_mdb =3D str(sys.argv[1]) s_mdb_pass =3D str(sys.argv[2]) s_target =3D str(sys.argv[3]) if len(sys.argv)>=3D3 else "" s_target_value =3D str(sys.argv[4]) if len(sys.argv)>=3D4 else "" a2m(s_mdb, s_mdb_pass, s_target, s_target_value) else: print("you need to supply 4 arguments - MDB/SDB file name, mdb/sdb = password - or # for blank value, target type (sql or mysql), and target = value (file_name.sql, or database name)") sys.exit() ------=_NextPart_000_0040_01D030F2.BDD6E360--