Array in DB schreiben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
marc
User
Beiträge: 5
Registriert: Donnerstag 11. September 2008, 12:03
Kontaktdaten:

Freitag 30. Januar 2009, 16:26

Hallo
Ich habe ein Programm mit der ich eine SPS auslese.
Dieses passiert hier:

Code: Alles auswählen

for i2 in range(0,69):
Byte[i2] = ord(ser.read(1))
Das ausgelesene Array muss nur noch mit dem aktuellen Zeitstempel ergäntzt werden und soll dan in die MySQL Datenbank geschrieben werden.
Desweiteren habe ich eine Verbindung zu MySql Datenbank.
Dort erstelle ich, wenn nicht vorhanden, eine passende Tabelle:

Code: Alles auswählen

def createTable1 ():
        dbstatement="CREATE TABLE IF NOT EXISTS %s (byte27 INT, byte28 INT, ... )" % TABLE1
    
        debug (dbstatement)
    
        try:
            conn = MySQLdb.connect (
                host = DBHOST,
                user = DBUSER,
                passwd = DBPASSWD,
                db = DBNAME)
            
            cursor = conn.cursor ()
            cursor.execute (dbstatement)
            cursor.close ()
            
        except Exception, err:
           print err;
        
        try:
            conn.close()
        except Exception,err:
            pass
Mein Problem ist zur Zeit: Wie bekomme ich das ausgelesene Array in einem Schritt in die Datenbank geschrieben. Wenn ich Einzelschritte mache, dann dauert das ganze zu lange.
Ich bin nicht ein absoluter Anfänger mit Python.
Marc
Ein Computer ist ein hochkomplexes System, in dem alles Mögliche und
Undurchschaubare geschieht, so dass es an ein Wunder grenzt, wenn ab und zu tatsächlich das passiert, was passieren soll.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 1. Februar 2009, 10:30

Gibt es für so etwas nicht den Datentyp BLOB? Statt eine Liste mit kleinen Zahlen, solltest du einen Byte-String in Python benutzen. Den kannst du dann in einer BLOB-Spalte in der Datenbank ablegen. Einen Byte-String bekommst du z.B. so:

Code: Alles auswählen

bytes = "".join(chr(b) for b in Byte)
Allerdings kannst du's dir viel einfacher machen, und einfach

Code: Alles auswählen

bytes = ser.read(70)

benutzen, würde ich vermuten.

Stefan
marc
User
Beiträge: 5
Registriert: Donnerstag 11. September 2008, 12:03
Kontaktdaten:

Sonntag 1. Februar 2009, 11:54

Hallo Stefan
Das mit dem Auslesen ist nicht das eigentliche Problem.
Ich schaffe es einfach nicht die Datene vernünftig in einem Rutsch in die DB zu schreiben.
Zur Zeit habe ich eine Mamutübergabe, das ist einfach nur schrecklich, und absolut unübersichtlich. Diese versuche ich zur Zeit zu entschärfen.
dbstatement="INSERT INTO %s (Byte0, Byte1, Byte2, Byte3, Byte4, Byte5, Byte6, Byte7, Byte8, Byte9, Byte10, Byte11, Byte12, Byte13, Byte14, Byte15, Byte16, Byte17, Byte18, Byte19, Byte20, Byte21, Byte22, Byte23, Byte24, Byte25, Byte26, Byte27, Byte28, Byte29, Byte30, Byte31, Byte32, Byte33, Byte34, Byte35) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" % (TABLE1, Byte[0], Byte[1], Byte[2], Byte[3], Byte[4], Byte[5], Byte[6], Byte[9], Byte[10], Byte[11], Byte[12], Byte[13], Byte[14], Byte[15], Byte[16], Byte[17], Byte[18], Byte[19], Byte[20], Byte[21], Byte[22], Byte[23], Byte[24], Byte[25], Byte[26], Byte[27], Byte[28], Byte[29], Byte[30], Byte[31], Byte[32], Byte[33], Byte[34], Byte[35])
debug (dbstatement)

try:
conn = MySQLdb.connect (
host = DBHOST,
user = DBUSER,
passwd = DBPASSWD,
db = DBNAME)

cursor = conn.cursor ()


print dbstatement
cursor.execute (dbstatement)

print 'stoppunkt1'
debug ( "Number of rows inserted: %d" % cursor.rowcount)
cursor.close ()
conn.commit()
print 'stoppunkt2'
except Exception, err:
print err;

try:
conn.close()
Das ist jetzt die erste Hälfte der Übergabe. "dbstatement="INSERT INTO" müste doppelt so lang sein um alle Daten zu übertragen.
Ich kann mir nicht vorstellen das es hier keine bessere Lösung gibt.
Marc
Ein Computer ist ein hochkomplexes System, in dem alles Mögliche und
Undurchschaubare geschieht, so dass es an ein Wunder grenzt, wenn ab und zu tatsächlich das passiert, was passieren soll.
BlackJack

Sonntag 1. Februar 2009, 12:53

Wenn Du unbedingt eine Tabelle mit 36 Spalten mit 36 Werten befüllen möchtest, dann wird das eben so in der Richtung aussehen. Die Frage ist halt, ob der Datenbankentwurf so besonders gut ist. Die Anzahl der Spalten; die sehr allgemeinen, durchnummerierten Namen dafür; und dass der Tabellenname anscheinend "variabel" ist, deuten auf nichts gutes hin.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 1. Februar 2009, 18:45

Wenn die Datenbank wirklich 70 Spalten für jeweils ein Byte hat, dann bist du gekniffen. Was ist denn das für ein Design? Bestenfalls fällt mir ein, dass man das SQL-Statement in einer Schleife bauen kann:

Code: Alles auswählen

sql = "INSERT INTO %s (%s) VALUES (%s)" % (
    table1, 
    ",".join("Byte%i" % i for i in range(70)),
    ",".join(["?"] * 70)
)
Bei Sqlite kann man den Columns-Teil auch weglassen. Dann bleiben 70 Fragezeichen. Die Variante mit den Parametern ist besser, da man IMHO immer parametrisierte Statements benutzen sollte und es dem Datenbank-Treiber überlassen sollte, wie er die Daten in das Statement packt.

Stefan
Antworten