mysql.connector.errors.InterfaceError:解析列信息失败?

2024-09-28 19:10:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个从头开始编写的python脚本,它们都执行相同的插入。不幸的是,此脚本会导致问题。我无法向自己解释错误信息。互联网上也没有发现任何东西

错误消息

Traceback (most recent call last):
  File "./bahncardkk-expo.py", line 249, in <module>
    sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection
  File "./bahncardkk-expo.py", line 207, in sqlinsert
    mydb.commit()
  File "/usr/local/lib/python3.8/dist-packages/mysql/connector/connection.py", line 852, in commit
    self._execute_query("COMMIT")
  File "/usr/local/lib/python3.8/dist-packages/mysql/connector/connection.py", line 871, in _execute_query
    self.cmd_query(query)
  File "/usr/local/lib/python3.8/dist-packages/mysql/connector/connection.py", line 490, in cmd_query
    result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
  File "/usr/local/lib/python3.8/dist-packages/mysql/connector/connection.py", line 404, in _handle_result
    columns[i] = self._protocol.parse_column(
  File "/usr/local/lib/python3.8/dist-packages/mysql/connector/protocol.py", line 249, in parse_column
    raise errors.InterfaceError("Failed parsing column information")
mysql.connector.errors.InterfaceError: Failed parsing column information

Skript(错误在中间开始,在埃森)“Buubun GGSKON HABEN -Z.B.”):

#!/usr/bin/python3
from selenium import webdriver
from seleniumrequests import Firefox
from time import sleep
from datetime import datetime
import mysql.connector
import requests
import struct
import random

#baue verbindung mit DK-Datenbank auf DK-vServer
mydb = mysql.connector.connect(
  host="localhost",
  user="user",
  password="forget",
  database="gnucash",
  buffered=True
)

sqlcursor = mydb.cursor(buffered=True)

new_onlineumsaetze = [['2020-12-12', 'FRANKFURT', '8.10']['2020-12-15', 'DB FERNVERKEHR AG  / FRANKFURT', '2.12']]

#print(new_onlineumsaetze)

# SQL INSERT ---------------------------------------------------------------------------
# ab hier sein alle fehlende Onlineumsätze sie nun in die Gnucash DB gehören
# zuerst aber muss in der Beschreibung nach bestimmte Wörter getriggert werden, damit das Skript weiß welche gegenkonto gebucht werden muss
# dann kommt die def funktion und macht den SQL Insert. (wichtig in python ist die def funktion und der auftrug immer vertauscht!)

def sqlinsert (postaktdatumhms,betrag,nbetrag,GUID,sqldescription):

    sleep(1) # sleep wird gebraucht damit keine doppelte also sekunden geaue enter_dates kommen. diese kann zu fehler führen bei abfragen mit Group BY. Daher jeder eintrag eine sekunde unterschiede.
    # und einige Zufallsvariabeln erstellt werden
    idkey1   = ("ffffdf1000000000000000"+("%5.0f"%(random.uniform(10000,18000)))+("%5.0f"%(random.uniform(10000,19000))))
    idkey2   = ("ffffdf2000000000000000"+("%5.0f"%(random.uniform(10000,19000)))+("%5.0f"%(random.uniform(10000,19000))))
    idkeyt   = ("ffffdfd000000000000000"+("%5.0f"%(random.uniform(10000,20000)))+("%5.0f"%(random.uniform(10000,19000))))
    idzufk   = ("%5.0f"%(random.uniform(10000,22000)))
    aktdatum         = datetime.now().strftime("%Y%m%d")
    enteraktdatumhms = datetime.now().strftime("%Y%m%d%H%M%S")

    # Abbuchungskonto SOLL - Bahncard Kreditkart
    sqlcursor.execute(""" 
    INSERT INTO `gnucash`.`splits` (`guid` , `tx_guid`, `account_guid`                   , `memo`, `action`, `reconcile_state`, `reconcile_date`     , `value_num`, `value_denom`, `quantity_num`, `quantity_denom`) 
    VALUES                         (%s     ,%s        ,'3a91ecde057dcf3c00f33219b076cfdc', ' '   , ' '     , 'n'              , '1970-01-01 00:00:00', %s         , '100'        , %s            , '100');
    """,(idkey1,idkeyt,nbetrag,nbetrag))
    mydb.commit()
    # Zubuchungskonto HABEN - z.B. Essen
    sqlcursor.execute(""" 
    INSERT INTO `gnucash`.`splits` (`guid` , `tx_guid`, `account_guid`                   , `memo`, `action`, `reconcile_state`, `reconcile_date`     , `value_num`, `value_denom`, `quantity_num`, `quantity_denom`) 
    VALUES                         (%s     ,    %s    ,  %s                              ,  ' '  , ' '     , 'n'              , '1970-01-01 00:00:00',   %s       , '100'        , %s            , '100');
    """,(idkey2,idkeyt,GUID,betrag,betrag))
    mydb.commit()
    # Transaktions ID (verbindet die zwei oberen zur einer Transaktions mitereinander) und wann
    sqlcursor.execute(""" 
    INSERT INTO `gnucash`.`slots`  (`id`   , `obj_guid`, `name`       , `slot_type`, `int64_val`, `timespec_val`       , `numeric_val_num`, `numeric_val_denom`, `gdate_val`)
    VALUES                         ( %s    ,  %s       , 'date-posted', '10'       , '0'        , '1970-01-01 00:00:00', '0'              , '1'                ,  %s           );
    """,(idzufk,idkeyt,aktdatum))
    mydb.commit()

    # Transaktionsbeschreibung sowie enter_date und Datum wann das geeschäfts statt fand
    sqlcursor.execute(""" 
   INSERT INTO `gnucash`.`transactions` (`guid` , `currency_guid`                   , `num`, `post_date`, `enter_date`, `description`) 
    VALUES                               ( %s    , 'bc59ea336e0e432d98568cc5ba4a5e5b', ' '  ,    %s      ,       %s    ,  %s );
    """,(idkeyt,postaktdatumhms,enteraktdatumhms,sqldescription))
    mydb.commit()

# hole die Zeilen raus die noch in der gnucashdb fehlend und suche nach trigger wonach dann das jeweilige buchungskonto an die sql insert funktion übergeben wird
print("falls Sätze fehlen printe folgende Datensätze und werden eingefügt:")
for row in new_onlineumsaetze:
    print(row)
    postaktdatumhms  = row[0]
    betrag  = (str(row[2])).replace(".","")
    nbetrag = (str("%.2f" %(float((-1))*(float(row[2])))).replace(".",""))

    #PAYPAL speziell wegen Liquitätsswap (KK über P2 zu P1)
    if any(wort in row[1] for wort in ['PAYPAL *dario.koceic / 35314369001']):
        GUID = "d989b2450db541a8baa545c4f0e3097a" #PayPal2 dario.koceic
        sqldescription = "auto von KK über P1 zu P2 -                 ACHTUNG Löschen, manuell eintrag noch nicht funktionfährig!!!                           <----"
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection

    #PAYPAL speziell wegen Liquitätsswap (KK über P1 zu P2)
    elif any(wort in row[1] for wort in ['PAYPAL *d.koceic / 35314369001']):
        GUID = "3c84c0329ef0451e812711fac616b721" #PayPal1 d.koceic
        sqldescription = "auto von KK über P2 zu P1 -                 ACHTUNG Löschen, manuell eintrag noch nicht funktionfährig!!!                           <----"
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection

    # WICHTIG   PaylPal muss vor Freizeit1 kommen!

    #Essen und Lebensmittel
    elif any(wort in row[1] for wort in ['ckerei Wimmer','Lidl','Aldi','MUELLER', 'Netto', 'BACKHAUS', 'Rossmann', 'EDEKA','MCDONALD','VINZENZ','YORMAS','Lekkerland','Elvetino AG','HEIGLBECK','DB FERNVERKEHR AG','DB FERNVERKEHR AG / FRANKFURT','OMV 7225 / Poing','NEUKAUF INGOLSTADT DON','BackWerk','RUBENBAUER','Autobahnrasthaus Hoch','NEWREST','STUDENAC','VICTA','TOMMY','DM - DROGERIE MARKT','Burger King','REWE']): 
        GUID = "eeafa371f8e44351b7f064706615db9c"
        sqldescription = row[1]
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection

    #Freizeit, Luxus und co.
    elif any(wort in row[1] for wort in ['Amazon.de', 'AMZN Mk', 'AMZN', 'Hornbach','Globus','MAERKLIN','Saturn','Geocaching','BAUHAUS','www.real.de','IBIS BUDGET','PAYPAL', 'ALIEXPRESS']):
        GUID = "03bcb39b7f3c4033a359dd98a683f8cf"
        sqldescription = row[1]
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection

    #Fahrkarten und Transport
    elif any(wort in row[1] for wort in ['DB BAHN A-NR','UBER','Flixbus','TIER']):
        GUID = "d45539b2745f4f87a013ab953ef26af2"
        sqldescription = row[1]
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection

    #Kleidung und Frisur
    elif any(wort in row[1] for wort in ['PRIMARK','GALERIA KAUFHOF',' C & A','Siemes Schuhcenter']):
        GUID = "fbe15d0b9440448a963a357e23e6a087"
        sqldescription = row[1]
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection

    #Finanzendienstleistungen, Auslandentg. und Zinsaufw.
    elif any(wort in row[1] for wort in ['1.50% AUSLANDSEINSATZENTGELT']):
        GUID = "3d9e3838b66a40dab3d3b5428bc93ccf"
        sqldescription = row[1]
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection

    #Bildung und Literatur
    elif any(wort in row[1] for wort in ['AUDIBLE','Audible Gmbh']):
        GUID = "64e20118bf7640e4952c4822c185b46d"
        sqldescription = row[1]
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription)

    # wenn alles nicht passt dann AUSGLEICHSKONTO
    else:
        GUID = "21b0142e39ff42d6a0979361ce7a8da5"
        sqldescription = row[1] + " +++ NICHT ZUORDBARER BUCHUNGSEINTRAG +++ bitte manuell aendern!                       <----                              <----                         <----"
        sqlinsert(postaktdatumhms,betrag,nbetrag,GUID,sqldescription) #gebe die gesammelte Daten in die def funktion sqlinsert für ein SQL Injection

mydb.close()


Tags: insqldefrowguiddieundwort