[FIXED] Die Ausgabe von Pandas .to_sql() überschreitet die Größenbeschränkung

Ausgabe

Ich verwende pydobc und sqlalchemy, um Daten in eine Tabelle in SQL Server einzufügen, und erhalte diesen Fehler.

https://i.stack.imgur.com/miSp9.png

Hier sind Ausschnitte der Funktionen, die ich verwende.

Dies ist die Funktion, die ich verwende, um eine Verbindung zum SQL-Server herzustellen (mit fast_executemany)

def connect(server, database):
    global cnxn_str, cnxn, cur, quoted, engine
    cnxn_str = ("Driver={SQL Server Native Client 11.0};"
                "Server=<server>;"
                "Database=<database>;"
                "UID=<user>;"
                "PWD=<password>;")
    cnxn = pyodbc.connect(cnxn_str)
    cur = cnxn.cursor()
    cur.fast_executemany=True

    quoted = quote_plus(cnxn_str)
    engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted), fast_executemany=True)

Und das ist die Funktion, die ich verwende, um die Daten abzufragen und in den SQL-Server einzufügen

def insert_to_sql_server():
    global df, np_array
    
    # Dataframe df is from a numpy array dtype = object
    df = pd.DataFrame(np_array[1:,],columns=np_array[0])
    
    # add new columns, data processing
    df['comp_key'] = df['col1']+"-"+df['col2'].astype(str)
    df['comp_key2'] = df['col3']+"-"+df['col4'].astype(str)+"-"+df['col5'].astype(str)
    df['comp_statusID'] = df['col6']+"-"+df['col7'].astype(str)

    convert_dict = {'col1': 'string', 'col2': 'string', ..., 'col_n': 'string'}
    
    # convert data types of columns from objects to strings
    df = df.astype(convert_dict)

    connect(<server>, <database>)
    cur.rollback()

    # Delete old records
    cur.execute("DELETE FROM <table>")

    cur.commit()

    # Insert dataframe to table
    df.to_sql(<table name>, engine, index=False, \
        if_exists='replace', schema='dbo', chunksize=1000, method='multi')

Die Einfügefunktion läuft etwa 30 Minuten lang, bevor sie schließlich die Fehlermeldung zurückgibt.

Bei einer kleineren df-Größe sind keine Fehler aufgetreten. Die aktuelle df-Größe, die ich habe, beträgt 27963 Zeilen und 9 Spalten. Eine Sache, die meiner Meinung nach zum Fehler beiträgt, ist die Länge der Zeichenfolge. Standardmäßig ist das numpy-Array dtype='<U25′, aber ich musste dies auf dtype=’object’ überschreiben, weil es die Textdaten kürzte.

Mir gehen die Ideen aus, weil sich der Fehler anscheinend auf Einschränkungen von Pandas oder SQL Server bezieht, mit denen ich nicht vertraut bin.

Vielen Dank

Lösung

Danke für den ganzen Input (noch neu hier)! Zufällig über die Lösung gestolpert, die durch Verkleinerung der df.to_sql aus

df.to_sql(chunksize=1000)

zu

df.to_sql(chunksize=200)

Nach dem Graben stellt sich heraus, dass es eine Einschränkung von SQL Server gibt ( https://discuss.dizzycoding.com/to_sql-pyodbc-count-field-incorrect-or-syntax-error/ )


Beantwortet von –
user19498404


Antwort geprüft von –
Clifford M. (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like