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)