txt->df->MS Server DB Fehler: column does not allow nulls
Verfasst: Freitag 23. April 2021, 10:30
Hallo Zusammen , ich arbeite seit einigen Tagen mit Python , bin also noch ein blutiger Anfänger - letztlich soll durch pm2 mit einem Python Skript, eine Datenpunpe erzeugt werden - erhoffe mir eine kleine Hilfestellung zu folgender Fehlermeldung.
Fehlermeldung:
" File "c:/testpumpe/Funktionen für MS DB und Auslesen/s1_s2_auf_db.py", line 38, in <module>
cursor.execute("INSERT INTO XXX.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10))
pyodbc.IntegrityError: ('23000', "[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert the value NULL into column 'id', table
'XXX.dbo.RAW-TEST-1'; column does not allow nulls. INSERT fails. (515) (SQLExecDirectW); [23000] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated. (3621)")"
Habe schon verschiedene Insert Befehle ausprobiert, bisher leider ohne Erfolg. Irgendwie mag die DB meine variablen nicht aufnehmen. s2 sollte auch kein ID feld sein.
Vielen Dank an jeden der sich Zeit für eine konstruktive Antwort/Kritik nimmt.
typische Zeile der *txt
3005584465;2855422-13;122264665226;0730;29.01.21;21:13:02;31.36;okay;;
Code:
import numpy as np
import pandas as pd
import pyodbc
server = 'xxx'
database = 'xxx'
username = 'xxx'
password = 'xxx'
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
df = pd.read_csv("back_full_mp29012021.txt",
sep=";",
header=None
)
df.columns = ["Auftragsnummer", "Materialnummer", "Seriennummer", "Prüfplatz","Datum","Uhrzeit","Prüfzeit","Status","Fehler","Messung"]
print (df)
#z - Zeile
z = 0
for row in df.itertuples():
s1=str(df['Auftragsnummer'][z])
s2=str(df['Materialnummer'][z])
s3=str(df['Seriennummer'][z])
s4=str(df['Prüfplatz'][z] )
s5=str(df['Datum'][z] )
s6=str(df['Uhrzeit'][z])
s7=str(df['Prüfzeit'][z])
s8=str(df['Status'][z])
s9=str(df['Fehler'][z])
s10=str(df['Messung'][z])
cursor = cnxn.cursor()
#Rest to_do _ ggf noch Fehlermeldungen abschneiden wegen String mit 50 Zeichen?
#cursor.execute("INSERT INTO xxx.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10))
cursor.execute("INSERT INTO xxx.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10))
#cursor.execute("""INSERT INTO xxx.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11)
#VALUES ({},{},{},{},{},{},{},{},{},{})".format(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10)""")
#cursor.execute("INSERT INTO xxx.dbo.[RAW-TEST-1] (s3,s4,s5,s6,s7,s8,s9,s10,s11,s12) values(?,?,?,?,?,?,?,?,?,?)", s1, s2, s3, s4, s5, s6, s7, s8, s9, s10)
#cursor.execute("""INSERT INTO xxx.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11)
#VALUES ("{s1}", "{s2}", "{s3}", "{s4}","{s5}","{s6}","{s7}","{s8}","{s9}","{s10}");""")
cnxn.commit()
cursor.close()
z=z+1 # Mit Z arbeiten für Prüfung auf neue Zahlen => in *.txt speichern und zu Beginn Zeilen zählen! Bei erolgreichem einfügen....
Fehlermeldung:
" File "c:/testpumpe/Funktionen für MS DB und Auslesen/s1_s2_auf_db.py", line 38, in <module>
cursor.execute("INSERT INTO XXX.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10))
pyodbc.IntegrityError: ('23000', "[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert the value NULL into column 'id', table
'XXX.dbo.RAW-TEST-1'; column does not allow nulls. INSERT fails. (515) (SQLExecDirectW); [23000] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated. (3621)")"
Habe schon verschiedene Insert Befehle ausprobiert, bisher leider ohne Erfolg. Irgendwie mag die DB meine variablen nicht aufnehmen. s2 sollte auch kein ID feld sein.
Vielen Dank an jeden der sich Zeit für eine konstruktive Antwort/Kritik nimmt.
typische Zeile der *txt
3005584465;2855422-13;122264665226;0730;29.01.21;21:13:02;31.36;okay;;
Code:
import numpy as np
import pandas as pd
import pyodbc
server = 'xxx'
database = 'xxx'
username = 'xxx'
password = 'xxx'
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
df = pd.read_csv("back_full_mp29012021.txt",
sep=";",
header=None
)
df.columns = ["Auftragsnummer", "Materialnummer", "Seriennummer", "Prüfplatz","Datum","Uhrzeit","Prüfzeit","Status","Fehler","Messung"]
print (df)
#z - Zeile
z = 0
for row in df.itertuples():
s1=str(df['Auftragsnummer'][z])
s2=str(df['Materialnummer'][z])
s3=str(df['Seriennummer'][z])
s4=str(df['Prüfplatz'][z] )
s5=str(df['Datum'][z] )
s6=str(df['Uhrzeit'][z])
s7=str(df['Prüfzeit'][z])
s8=str(df['Status'][z])
s9=str(df['Fehler'][z])
s10=str(df['Messung'][z])
cursor = cnxn.cursor()
#Rest to_do _ ggf noch Fehlermeldungen abschneiden wegen String mit 50 Zeichen?
#cursor.execute("INSERT INTO xxx.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10))
cursor.execute("INSERT INTO xxx.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (s1, s2, s3, s4, s5, s6, s7, s8, s9, s10))
#cursor.execute("""INSERT INTO xxx.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11)
#VALUES ({},{},{},{},{},{},{},{},{},{})".format(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10)""")
#cursor.execute("INSERT INTO xxx.dbo.[RAW-TEST-1] (s3,s4,s5,s6,s7,s8,s9,s10,s11,s12) values(?,?,?,?,?,?,?,?,?,?)", s1, s2, s3, s4, s5, s6, s7, s8, s9, s10)
#cursor.execute("""INSERT INTO xxx.dbo.[RAW-TEST-1] (s2, s3, s4, s5, s6, s7, s8, s9, s10, s11)
#VALUES ("{s1}", "{s2}", "{s3}", "{s4}","{s5}","{s6}","{s7}","{s8}","{s9}","{s10}");""")
cnxn.commit()
cursor.close()
z=z+1 # Mit Z arbeiten für Prüfung auf neue Zahlen => in *.txt speichern und zu Beginn Zeilen zählen! Bei erolgreichem einfügen....