I wrote the following functions for transferring data from Access to Firebird
def getFirebirdFieldNames(firebird_cursor, tablename): firebird_cursor.execute('select rdb$field_name from rdb$relation_fields where rdb$relation_name=\'%s\' order by rdb$field_position' % (tablename,)) field_names = list() for c in firebird_cursor.fetchall(): field_names.append(c[0]) return field_names def FirebirdDatetime(dt): return '\'%s.%s.%s\'' % (str(dt.day).rjust(2,'0'), str(dt.month).rjust(2,'0'), str(dt.year).rjust(4,'0')) def SelectFromAccessTable(tablename): return 'select * from [' + tablename+']' def InsertToFirebirdTable(tablename, row): values='' #values=values.encode('cp1251', 'replace') # copyrow=[] # print type(values) for i in range(len(row)): #print row[i] #print type(row[i]) #temp='' if (i<len(row)-1): if type(row[i]) == int: temp = str(row[i]) else: if type(row[i]) == str: temp = '\'%s\'' % (row[i],) else: if type(row[i]) == datetime.datetime: temp =FirebirdDatetime(row[i]) else: if type(row[i]) == decimal.Decimal: temp = str(row[i]) else: if row[i]==None: temp='null' values+=temp+', ' else: if type(row[i]) == int: temp = str(row[i]) else: if type(row[i]) == str: temp = '\'%s\'' % (row[i],) else: if type(row[i]) == datetime.datetime: temp =FirebirdDatetime(row[i]) else: if type(row[i]) == decimal.Decimal: temp = str(row[i]) else: if row[i]==None: temp='null' values+=temp print temp return 'insert into '+tablename+' values ('+values+')' def AccessToFirebird(accesstablename, firebirdtablename, accesscursor, firebirdcursor): SelectSql=SelectFromAccessTable(accesstablename) for row in accesscursor.execute(SelectSql): InsertSql=InsertToFirebirdTable(firebirdtablename, row) InsertSql=InsertSql print InsertSql firebirdcursor.execute(InsertSql) When the AccessToFirebird function is AccessToFirebird in the main module, the InsertToFirebirdTable function is InsertToFirebirdTable , in which the generated insert requests are displayed on the screen. As can be seen from the output below, temp assigned to row[0] and does not change later, which contradicts the logic of the program (the loop bypasses the entire row and the result should be an insert query with all values passed). Why is this happening and how to make the result fit the goal? I quote the output of the generated queries (the Northwind database in Access)
1 1 1 1 null null null null null null null null null null null null null null insert into CLIENTS values (1, 1, 1, 1, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 2 2 2 2 null null null null null null null null null null null null null null insert into CLIENTS values (2, 2, 2, 2, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 3 3 3 3 null null null null null null null null null null null null null null insert into CLIENTS values (3, 3, 3, 3, null, null, null, null, null, null, null, null, null, null, null, null, null, null) 4 4 4 4 null null null null null null null null null null null null null null insert into CLIENTS values (4, 4, 4, 4, null, null, null, null, null, null, null, null, null, null, null, null, null, null)