Python und MS SQL FILESTREAM

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist immer noch schlecht, dass tabelle eine Variable ist, normalerweise hat man keine Variablen Tabellennamen.

UniqueIdentifier über gibt man normalerweise nicht bei INSERT, weil die automatisch erstellt werden sollten. In Deinem ersten Post, ist der ja auch noch nicht da.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@Sirius3: was meinst du mit UniqueIdentifier?

Außerdem muss die Tabelle eine Variable sein, da es verschiedene Tabellen später sind wo das gespeichert werden soll.

Z.B.: 23422
23491
Usw.

Da die Werkzeuge zu einer bestimmten Maschine gehören
Zuletzt geändert von badi113 am Samstag 13. April 2019, 12:38, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Das mußt Du doch selbst wissen, denn Du hast die Tabelle erzeugt.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@Sirius3: Klick jetzt weiß ich wieder, das steht bei ID drinne.

Aber so ganz genau weiß ich das nicht da ich das so kopiert habe :|
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Dein Tabellendesign ist kaputt, wenn die Struktur der Tabellen für verschiedene Maschinen gleicht ist und sich nur anhand des Namens der Relation unterscheidet.
In dem Fall gehört der Name der Relation in eine Spalte.

Stichworte zum Googeln: "Relationale Datenbanken" und "Normalisierung".

In deinem Fall heißt das: Die Tabelle muss eine Spalte "Maschine" haben statt lauter Tabellen mit dem Maschinennamen.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

Hy Leute,
habe den Rat befolgt so das alle Wkz in eine Tabelle kommen.

Nun habe Ich die Datenbank und die Tabelle neu erstellt, um noch mal ganz von vorne damit anzufangen.

Die Tabelle ist wie folgt aufgebaut.

Code: Alles auswählen

CREATE TABLE Datenbank.dbo.Werkzeuge
(
    [Id] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
	[Name] VARCHAR(MAX) NOT NULL, 
    [SerialNumber] INTEGER UNIQUE,
    [Chart] VARBINARY(MAX) FILESTREAM NULL
)
GO

Code: Alles auswählen

	if result is None:
                
                sql = ("INSERT INTO Werkzeuge([Name], [SerialNumber], [Chart])values(?, ?, ?)")
                cur.execute(sql, s_name, manr,  bild1)    
                
                
            else:
                print("weiter")
                tkinter.messagebox.showwarning("info", "Werkzeug schon vorhanden")
                
            con.commit()
            con.close()
            abbrechen()
Nun hab ich Id nicht mit reingenommen in INTO und bekomme trotzdem die Fehlermeldung

pyodbc.IntegrityError: ('23000', '[23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Der Wert NULL kann in die Id-Spalte, Datenbank.dbo.Werkzeuge-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT. (515) (SQLParamData); [23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Die Anweisung wurde beendet. (3621)')


Obwohl id gar nicht erwähnt wird?.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@badi113: Naja, was wird denn in `id` eingetragen wenn kein Wert dafür übergeben wird? Das ist wohl etwas was Du auf Datenbankseite regeln musst.

Und der `execute()`-Aufruf ist falsch. Die drei Werte müssen als *ein* Argument übergeben werden. Die API sieht für diese Methode nur zwei Argumente vor – die SQL-Anweisung als erstes Argument und optional die Werte für Platzhalter als zweites Argument. Dass da keine Ausnahme kommt, liegt an dem konkreten Datenbankmodul.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@__blackjack__: die Fehlermeldung die er vorher bekommen hat, suggeriert das er eben doch mehrere Argumente uebergeben muss. Ggf. ist pyodbc da nicht-standard?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: nein, die vorherige Fehlermeldung sagte, dass er keine Liste von Tuplen übergeben darf. Der OP hat etliche Varianten durchgeraten, aber nie die richtige erwischt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ahhh. Nunja, der Rate-Raum ist ein grosser welcher....
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@__blackjack__: Aber heißt nich uniqueidentifier das der SQL Server das selber macht? Also den eintrag generieren?

Code: Alles auswählen

if result is None:
                eintrag = (s_name, manr, bild1)
                sql = ("INSERT INTO Werkzeuge([Name], [SerialNumber], [Chart])values(?, ?, ?)")
                cur.execute(sql, eintrag)    

Meinst du in etwa so?
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@badi113: Ja genau so war das gemeint mit den Werten.

MS SQL ist nicht meine Baustelle, keine Ahnung wie man da die DB dazu bewegt selbstständig einen Schlüssel zu generieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Meine MS SQL-Zeit ist lange vorbei und die machen viel seltsames Kram - weshalb man sich damit eigentlich nicht rumschlagen will.
Ich glaube das Schlüsselwort war "identity" um eine selbstinkrementierende ID zu erhalten.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@sparrow: Von wollen kann keine rede sein, aber wir arbeiten nur mit ms sql :cry:

Eigentlich wahr es mal so gedacht dass alles in txt Dateien und Ordner gespeichert werden sollte, hatt auch alles geklappt. Bis jemand kam und meinte in SQL wäre besser.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist es auch. Die Menge an Fehlern, die du bei einer selbstgestrickten Loesung machen kannst ist mitnichten geringer.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

Glaub ich ja auch, aber das das so ausartet hätt ich nicht gedacht. Zumindest das mit den Bildern, text oder zahlen in die datenbank zu bekommen ist ja einfach aber Bilder!. :shock:
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

Moin Jungs, man kann ja auch bilder ohne filestream speichern.
Was ist eure meinung dazu?.

Bekomme die Bilder als binary gespeichert.
Größe der Bilder währ max 500kb.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@badi113: bisher habe ich noch nicht gesehen, dass Du Probleme mit den Bildern hast, Du hast viel grundlegendere Probleme.
Bei großen Datenmengen (BLOBs) kann es schon Sinn machen, die auf einem Filesystem zu speichern. Kommt halt auch drauf an, was das Datenbanksystem taugt.
badi113
User
Beiträge: 22
Registriert: Mittwoch 27. März 2019, 14:53

@Sirius3: Naja bisher bekam ich halt die Bilder nicht in den Filestream, ich weiß das mein Script bestimmt noch Fehler oder Unstimmigkeiten aufweisen, oder was meinst du?. Aber wie gesagt ich mach das nur nebenbei als Hobby und bringe es mir selbst bei.
Antworten