mysql query

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sarah

Freitag 19. August 2005, 20:33

Hi,

leider funktioniert es immer noch nicht:( Ok eigentlich kann ich ja nur unterscheiden zwischen
latin-1 oder unicode. Eigentlich müßte eine Variante ja funtionieren. Ok ich hab mal im Forum geschaut und hab
nen ähnliches Skript gefunden wo r.get_query genutzt wird.
Also folgendes Skript funktioniert bei mir:

Code: Alles auswählen

import _mysql
db= _mysql.connect(host="localhost",user="root",passwd="",db="test")

s = """ CRAETE TABLE stern (DAT INTEGER(8), GER VARCHAR(5), )"""

print s
print repr(s)
db.query(s)
Die print Anweisung hAB ICH NUR UM ZU SEHEN WIE der query in der Shell aussieht.

Gut nun habe ich nen Skript gefunden welches wo auch die Fehlermedlung kommt das der
MYSQL Syntax falsch ist, unter dem Thread xml einlesen. Und Progchild hat
dieses Skript programmiert:
http://python.sandtner.net/viewtopic.ph ... c83e01196c

Code: Alles auswählen

import xml.parsers.expat 

class Reader: 

    def read( self, filename ): 
        self.query = 'CREATE TABLE ' 
        self.path = [] 

        p = xml.parsers.expat.ParserCreate() 

        p.StartElementHandler = self.start_element 
        p.EndElementHandler = self.end_element 
        p.CharacterDataHandler = self.char_data 

        f = open("C:{test.xml", 'r' ) 
        p.ParseFile( f ) 
        f.close() 

    def start_element( self, name, attrs): 
        path = "/" . join( self.path ) 
        if path == 'Media/Table/FixedLength/FixedColumn': 
            if name == 'Numeric': 
                self.query += "INTEGER(" 
            if name == 'AlphaNumeric': 
                self.query += "VARCHAR(" 
            
        self.path.append( name ) 
        self.cur_data = '' 
    
    def end_element( self, name): 
        path = "/" . join( self.path ) 
        if path == 'Media/Table/Name': 
            self.query += self.cur_data + "\n(\n" 
        
        if path == 'Media/Table/FixedLength/FixedColumn/Name': 
            self.query += self.cur_data + " " 

        if path == 'Media/Table/FixedLength/FixedColumn' + \ 
            '/FixedRange/Length': 
            self.query += self.cur_data 

        if path == 'Media/Table/FixedLength/FixedColumn': 
            self.query += "),\n" 

        if path == 'Media/Table': 
            self.query += ")\n" 


        del self.path[-1] 
    
    def char_data( self, data): 
        self.cur_data += data 

    def get_query( self ): 
        return self.query 


r = Reader() 
r.read( 'C:\test.xml' ) 
s = r.get_query() 
s = s.encode('latin-1')
print s
print repr(s)
db.query(s)
bei beiden Skripten gibt die print s und
print repr(s) den gleichen query aus. Er sieht haargenau aus!!!
Ich bin schon total verzeifelt und probier und probier schon tagelang und stundenlang.
Ich weiß nicht.. Prochild oder irgend ein anderer kluger könnt ihr da mal gucken bzw. testen?

MFG

Sarah
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 19. August 2005, 20:47

Warum benutzt du das lowlevel _mysql-Modul, wenn du auch MySLQdb haben kannst, dass vermutlich weniger Probleme macht?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Samstag 20. August 2005, 00:24

Sarah hat geschrieben:f = open("C:{test.xml", 'r' )
r.read( 'C:\test.xml' )
Entweder musst du beidesmale den Backslash doppeln (im ersten Beispiel das { durch \\ ersetzen ;)) oder den String mittels r als Raw markieren:

Code: Alles auswählen

a = file(r"C:\AUTOEXEC.BAT")
Weiss nicht, ob es daran liegt.
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Samstag 20. August 2005, 00:58

Sarah hat geschrieben:

Code: Alles auswählen

import _mysql
db= _mysql.connect(host="localhost",user="root",passwd="",db="test")

s = """ CRAETE TABLE stern (DAT INTEGER(8), GER VARCHAR(5), )"""

print s
print repr(s)
db.query(s)
CRAETE TABLE? Müsste das nicht CREATE statt CRAETE heißen :roll:
Außerdem ist da zum schluss ein Komma zu viel.

Ich hab hier noch mal ein minimales beispiel, das dein Query ausführen sollte.

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: UTF-8 -*-

import MySQLdb

connection = MySQLdb.connect(
	host='localhost', 
	user='root', 
	passwd = 'geheim', 
	db = 'datenbank'  #Wichtig, muss exisieren
)
	
cursor = connection.cursor()

try: 
	query = """CREATE TABLE stern (DAT INTEGER( 8 ), GER VARCHAR( 5 ) )""" 

	cursor.execute( query )

	connection.commit()
except MySQLdb.Error, e:
	connection.rollback()
	
	print "Fehler: %s" % str(e)
else:
	print "Fertig"
Edit: Smily aus Python Code entfehrnt...
Sarah

Samstag 20. August 2005, 13:59

Hallo,

Ok, ok ich nutze jetzt das Modul MySQLdb:) Aber dies ändert nichts an dem
eigensächlichen Problem leider.
Ich arbeite jetzt nur n dem Skript von Progchild damit er sich nicht in meins
reindenken muss.
Im Query ...NUMMER(8), ) ist noch das Komma hintedran(obwohl es nicht sytanktisch richtig ist)
weil dein Skript ja nicht unterscheiden kann obs das letzte Feld ist oder nicht
und immer auch dort das Komma noch hintendran kommt obwohls das letzte Feld ist.
Das Komma stört auch nicht. In nem andern Skript führ er den query mit dem Komma auch aus.
Ok ich habe jetzt dein Skript so angepaßt:

Code: Alles auswählen

import xml.parsers.expat 
import MySQLdb

class Reader: 

    def read( self, filename ): 
        self.query = 'CREATE TABLE ' 
        self.path = [] 

        p = xml.parsers.expat.ParserCreate() 

        p.StartElementHandler = self.start_element 
        p.EndElementHandler = self.end_element 
        p.CharacterDataHandler = self.char_data 

        f = open("C:/test.xml", 'r' ) 
        p.ParseFile( f ) 
        f.close() 

    def start_element( self, name, attrs): 
        path = "/" . join( self.path ) 
        if path == 'Media/Table/FixedLength/FixedColumn': 
            if name == 'Numeric': 
                self.query += "INTEGER(" 
            if name == 'AlphaNumeric': 
                self.query += "VARCHAR(" 
            
        self.path.append( name ) 
        self.cur_data = '' 
    
    def end_element( self, name): 
        path = "/" . join( self.path ) 
        if path == 'Media/Table/Name': 
            self.query += self.cur_data + "\n(\n" 
        
        if path == 'Media/Table/FixedLength/FixedColumn/Name': 
            self.query += self.cur_data + " " 

        if path == 'Media/Table/FixedLength/FixedColumn' + \ 
            '/FixedRange/Length': 
            self.query += self.cur_data 

        if path == 'Media/Table/FixedLength/FixedColumn': 
            self.query += "),\n" 

        if path == 'Media/Table': 
            self.query += ")\n" 


        del self.path[-1] 
    
    def char_data( self, data): 
        self.cur_data += data 

    def get_query( self ): 
        return self.query 


r = Reader() 
r.read( 'C:\test.xml' ) 
s = r.get_query() 
s = s.encode('latin-1') 
connection = MySQLdb.connect( 
    host='localhost', 
    user='root', 
    passwd = 'geheim', 
    db = 'test'  #Wichtig, muss exisieren 
) 
    
cursor = connection.cursor() 

try: 
    query = s

    cursor.execute( query ) 

    connection.commit() 
except MySQLdb.Error, e: 
    connection.rollback() 
    
    print "Fehler: %s" % str(e) 
else: 
    print "Fertig"

So und immer kommt der Fehler das der SQl Syntax nicht richtig ist. genau wie vorher.
Das hängt irgendwie mit dem r.get_query() zusammen. Weil das ganze Skript würde laufen wenn
man bei s nicht r.get_query nutzen würde sondern nen fiktiven query eintragen würd. Aber ziel ist es ja den
den query zu nutzen der durch dies Programm erstllt wurde.

Ich weiß wirklich nicht mehr weiter. Könnt den Rechner schon fast aus Fenster werfen. hat nicht jemand von euch ne Datenbank und kann es mal bei sich testen?
SQL ist wirklich kein Prob nur irgendwie hängts nur speziell bei diesem Programm.
Dank dir Progchild das du dir noch wegen meinem Prob die Nacht um die Ohren geschlagen hast:)

MFG


Sarah

Edit (Leonidas): Code in Python-Tags gesetzt und Smileys rausgenommen.
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Samstag 20. August 2005, 14:36

Sarah hat geschrieben:Hallo,

Ich arbeite jetzt nur n dem Skript von Progchild damit er sich nicht in meins
reindenken muss.
Im Query ...NUMMER( 8 ), ) ist noch das Komma hintedran(obwohl es nicht sytanktisch richtig ist)
weil dein Skript ja nicht unterscheiden kann obs das letzte Feld ist oder nicht
und immer auch dort das Komma noch hintendran kommt obwohls das letzte Feld ist.
Das Komma stört auch nicht. In nem andern Skript führ er den query mit dem Komma auch aus.
Also bei mir stört das Komma schon... Hier mal eine Version, die auf das Komma achtet, denn ich bekomme mit Komma einen Syntax Fehler...

Erstmal die XML-Datei (test.xml):

Code: Alles auswählen

<?xml version="1.0"?>
<Media>
<Name>CD Nummer 1</Name>
<Table>
<URL>Test.ASC</URL>
<Name>daten</Name>
<Description>...</Description>

<!-- Spezifiziert den Dezimaltrenner -->
<DecimalSymbol>,</DecimalSymbol>
<SkipNumBytes>97</SkipNumBytes>
<FixedLength>
<FixedColumn>
<Name>NUMMER</Name>
<Numeric/>
<FixedRange>
<From>97</From>
<Length>4</Length>
</FixedRange>
</FixedColumn>
<FixedColumn>
<Name>Name</Name>
<AlphaNumeric/>
<FixedRange>
<From>101</From>
<Length>12</Length>
</FixedRange>
</FixedColumn>

</FixedLength>

</Table>
</Media>
Und hier der Python Code

Code: Alles auswählen

import xml.parsers.expat
import MySQLdb

class Reader:
	def read( self, filename ):
		self.query = 'CREATE TABLE '
		self.path = []

		p = xml.parsers.expat.ParserCreate()

		p.StartElementHandler = self.start_element
		p.EndElementHandler = self.end_element
		p.CharacterDataHandler = self.char_data

		f = open( filename, 'r' )
		p.ParseFile( f )
		f.close()

	def add_seperator( self ):
		if not self.first_col:
			self.query += ",\n"
		else:
			self.first_col = False

	def start_element( self, name, attrs):
		path = "/" . join( self.path )

		if path == 'Media':
			if name == 'Table':
				self.first_col = True
		
		if path == 'Media/Table/FixedLength/FixedColumn':
			
			if name == 'Numeric':
				self.query += "INTEGER("
			if name == 'AlphaNumeric':
				self.query += "VARCHAR("
		   
		self.path.append( name )
		self.cur_data = ''
   
	def end_element( self, name):
		path = "/" . join( self.path )
		if path == 'Media/Table/Name':
			self.query += self.cur_data + "\n(\n"
	   
		if path == 'Media/Table/FixedLength/FixedColumn/Name':
			self.add_seperator()
			self.query += self.cur_data + " "
					
		if path == 'Media/Table/FixedLength/FixedColumn' + \
			'/FixedRange/Length':
			self.query += self.cur_data

		if path == 'Media/Table/FixedLength/FixedColumn':
			self.query += ")"

		if path == 'Media/Table':
			self.query += "\n)\n"

		del self.path[-1]
   
	def char_data( self, data):
		self.cur_data += data

	def get_query( self ):
		return self.query


r = Reader()
r.read( 'test.xml' )
query = r.get_query().encode('latin-1')

connection = MySQLdb.connect(
	host='localhost',
	user='root',
	passwd = 'geheim',
	db = 'datenbank'  #Wichtig, muss exisieren
)
   
cursor = connection.cursor()

try:
	print "Start Query:\n%s" % query

	cursor.execute( query )

	connection.commit()
except MySQLdb.Error, e:
	connection.rollback()
   
	print "Fehler: %s" % str(e)
else:
	print "Query erfolgreich!"
So klappt es bei mir...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 20. August 2005, 15:14

Ich habe zwar keine MySQL Datenbank, dafür aber SQLite.

tabl.xml

Code: Alles auswählen

<?xml version="1.0"?>

<Media>
    <Name>CD Nummer 1</Name>
    <Table>
        <URL>Test.ASC</URL>
        <Name>daten</Name>
        <Description>...</Description>

        <FixedColumn>
            <Name>NUMMER</Name>
            <Numeric/>
    
            <FixedRange>
                <From>97</From>
                <Length>4</Length>
            </FixedRange>
        
        </FixedColumn>
    
        <FixedColumn>
            <Name>Name</Name>
            <AlphaNumeric/>
        
            <FixedRange>
                <From>101</From>
                <Length>12</Length>
            </FixedRange>
        
        </FixedColumn>
    </Table>
</Media>

Code: Alles auswählen

from pysqlite2 import dbapi2 as sqlite
import xml.sax, xml.sax.handler

def create_sql(values):
    """Creates a SQL statement"""
    sql = 'CREATE TABLE stern ('
    for key, item in values.items():
        sql += '%(name)s %(type)s(%(length)s), ' % {'name' : key, 'type' : item['type'], 'length' : item['length'] }
    
    # remove the last newline and comma
    sql = sql[:-2]
    # finish statement
    sql += ');'
    return sql

class TablHandler(xml.sax.handler.ContentHandler):
    def __init__(self):
        self.in_name = False
        self.in_fc = False
        self.in_len = False
        self.in_from = False
        
        self.values = {}
        self.currentname = ''
        
    def startElement(self, name, attrs):
        
        # check what tag was opened
        if name == 'FixedColumn':
            # we're in FixedColumn, so we are permitted to parse Name-tags
            self.in_fc = True
        elif name == 'Name' and self.in_fc:
            # only permit parsing if we are in FixedColumn
            self.in_name = True
        elif name == 'Length':
            # we're in Length tag
            self.in_len = True
        elif name == 'From':
            # we're in From tag
            self.in_from = True
        elif name == 'Numeric':
            # the empty tag Numeric occured
            self.values[self.currentname]['type'] = 'INTEGER'
        elif name == 'AlphaNumeric':
            self.values[self.currentname]['type'] = 'VARCHAR'
    
    def characters(self, data):
        if self.in_name:
            self.currentname = data
            self.values[self.currentname] = {}
        elif self.in_len:
            self.values[self.currentname]['length'] = data
        elif self.in_from:
            self.values[self.currentname]['from'] = data
    
    def endElement(self, name):
        if name == 'FixedColumn':
            self.in_fc = False
        elif name == 'Name':
            self.in_name = False
        elif name == 'Length':
            self.in_len = False
        elif name == 'From':
            self.in_from = False
        

def parsedata_sax(filename):
    parser = xml.sax.make_parser()
    handler = TablHandler()
    parser.setContentHandler(handler)
    parser.parse(filename)
    return handler.values

values = parsedata_sax('tabl.xml')
s = create_sql(values)

connection = sqlite.connect('tabl.sqdb')
cursor = connection.cursor()

try:
    query = s
    cursor.execute(query)
    connection.commit()
except Exception, e:
    connection.rollback()
    print "Fehler: %s" % str(e)
else:
    print "Fertig"
Die SQLite-relevanten Stellen musst du auswechseln, der Rest sollte auch so gehen. Und ja, diesmal mit SAX aufgrund großer Nachfrage nach XML-Parsern :D

Auch SQLite stört sich an dem Komma, deswegen habe ich es beim SQL Generator entfernt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Samstag 20. August 2005, 16:32

Du schreibst immer noch C:\test.xml anstatt C:\\test.xml, die Datei wird er deshalb gar nicht öffnen können, weil "C:[TABULATOR]est.xml" nicht da ist.
Entweder

Code: Alles auswählen

"C:\\test.xml"
oder

Code: Alles auswählen

r"C:\text.xml"
Sarah

Samstag 20. August 2005, 17:48

Hallo,

ja scheint verschieden zu sein. Gut hab die Version die bei dir geht ma getestet.
Klar bei mir maekelt er wieder wegen dem SQL Syntax.
Gut irgendwie muss das Problem ja geloest werden.
Ich hab mal nachgeschaut bei meiner Mysql Datenbank. Das Characterset ist latin1.
In deinem Skript wird ja auch davon ausgegangen.
so ich habe ein ganz einfaches Skript welches eine Tablle erfolgreich erstellt.

Code: Alles auswählen

import MySQLdb 

connection = MySQLdb.connect( 
    host='localhost', 
    user='root', 
    passwd = '', 
    db = 'test'  #Wichtig, muss exisieren 
) 
    
cursor = connection.cursor() 

try: 
    query = 'CREATE TABLE stern (DAT INTEGER(8), GER VARCHAR(5))'

    cursor.execute( query ) 

    connection.commit() 
    print query
    print repr(query)
except MySQLdb.Error, e: 
    connection.rollback() 
    
    print "Fehler: %s" % str(e) 
else: 
    print "Fertig"
Als Ausgabe vo den print Anweisungen erhalte ich:

CREATE TABLE stern (DAT INTEGER(8), GER VARCHAR(5))
'CREATE TABLE stern (DAT INTEGER(8), GER VARCHAR(5))'

Ich koennte auch noch nen Semikolon benutzen, w
Sarah

Samstag 20. August 2005, 18:59

Ich koennte auch noch nen Semikolon benutzen, wuerd auch klappen.

So jetzt nehm ich dein Skript:

Code: Alles auswählen

import xml.parsers.expat 
import MySQLdb 

class Reader: 
    def read( self, filename ): 
        self.query = 'CREATE TABLE ' 
        self.path = [] 

        p = xml.parsers.expat.ParserCreate() 

        p.StartElementHandler = self.start_element 
        p.EndElementHandler = self.end_element 
        p.CharacterDataHandler = self.char_data 

        f = open("C:/test.xml", 'r' ) 
        p.ParseFile( f ) 
        f.close() 

    def add_seperator( self ): 
        if not self.first_col: 
            self.query += ", " 
        else: 
            self.first_col = False 

    def start_element( self, name, attrs): 
        path = "/" . join( self.path ) 

        if path == 'Media': 
            if name == 'Table': 
                self.first_col = True 
        
        if path == 'Media/Table/FixedLength/FixedColumn': 
            
            if name == 'Numeric': 
                self.query += "INTEGER(" 
            if name == 'AlphaNumeric': 
                self.query += "VARCHAR(" 
            
        self.path.append( name ) 
        self.cur_data = '' 
    
    def end_element( self, name): 
        path = "/" . join( self.path ) 
        if path == 'Media/Table/Name': 
            self.query += self.cur_data + "(" 
        
        if path == 'Media/Table/FixedLength/FixedColumn/Name': 
            self.add_seperator() 
            self.query += self.cur_data + " " 
                    
        if path == 'Media/Table/FixedLength/FixedColumn' + \ 
            '/FixedRange/Length': 
            self.query += self.cur_data 

        if path == 'Media/Table/FixedLength/FixedColumn': 
            self.query += ")" 

        if path == 'Media/Table': 
            self.query += ")" 

        del self.path[-1] 
    
    def char_data( self, data): 
        self.cur_data += data 

    def get_query( self ): 
        return self.query 


r = Reader() 
r.read( 'test.xml' ) 
query = r.get_query().encode('latin-1') 

connection = MySQLdb.connect( 
    host='localhost', 
    user='root', 
    passwd = '', 
    db = 'test'  #Wichtig, muss exisieren 
) 
    
cursor = connection.cursor() 

try: 
    print "Start Query:\n%s" % query 
    print repr(query)

    cursor.execute( query ) 

    connection.commit() 
except MySQLdb.Error, e: 
    connection.rollback() 
    
    print "Fehler: %s" % str(e) 
else: 
    print "Query erfolgreich!"
So bei den beiden Printanweisungen erhalt ich folgendes:

CREATE TABLE stat (DAT INTEGER(8), GER VARCHAR(5))
'CREATE TABLE stat (DAT INTEGER(8), GER VARCHAR(5))'

Genau wie im ersten Skript.

Ich denke das ist der einzige Ansatz drauf zu kommen. Ich wei
Sarah

Samstag 20. August 2005, 19:02

Sorry irgendwas geht nicht....
Vielleicht kann der Admin da nen bi
Sarah

Sonntag 21. August 2005, 11:56

Hallo,

ja scheint verschieden zu sein. Gut hab die Version die bei dir geht ma getestet.
Klar bei mir maekelt er wieder wegen dem SQL Syntax.
Gut irgendwie muss das Problem ja geloest werden.
Ich hab mal nachgeschaut bei meiner Mysql Datenbank. Das Characterset ist latin1.
In deinem Skript wird ja auch davon ausgegangen.
so ich habe ein ganz einfaches Skript welches eine Tablle erfolgreich erstellt.

Code: Alles auswählen

import MySQLdb 

connection = MySQLdb.connect( 
    host='localhost', 
    user='root', 
    passwd = '', 
    db = 'test'  #Wichtig, muss exisieren 
) 
    
cursor = connection.cursor() 

try: 
    query = 'CREATE TABLE stern (DAT INTEGER(8), GER VARCHAR(5))'

    cursor.execute( query ) 

    connection.commit() 
    print query
    print repr(query)
except MySQLdb.Error, e: 
    connection.rollback() 
    
    print "Fehler: %s" % str(e) 
else: 
    print "Fertig"
Als Ausgabe vo den print Anweisungen erhalte ich:

CREATE TABLE stern (DAT INTEGER(8), GER VARCHAR(5))
'CREATE TABLE stern (DAT INTEGER(8), GER VARCHAR(5))'

Ich koennte auch noch nen Semikolon benutzen, wuerd auch klappen.

So jetzt nehm ich dein Skript:

Code: Alles auswählen

import xml.parsers.expat 
import MySQLdb 

class Reader: 
    def read( self, filename ): 
        self.query = 'CREATE TABLE ' 
        self.path = [] 

        p = xml.parsers.expat.ParserCreate() 

        p.StartElementHandler = self.start_element 
        p.EndElementHandler = self.end_element 
        p.CharacterDataHandler = self.char_data 

        f = open("C:/test.xml", 'r' ) 
        p.ParseFile( f ) 
        f.close() 

    def add_seperator( self ): 
        if not self.first_col: 
            self.query += ", " 
        else: 
            self.first_col = False 

    def start_element( self, name, attrs): 
        path = "/" . join( self.path ) 

        if path == 'Media': 
            if name == 'Table': 
                self.first_col = True 
        
        if path == 'Media/Table/FixedLength/FixedColumn': 
            
            if name == 'Numeric': 
                self.query += "INTEGER(" 
            if name == 'AlphaNumeric': 
                self.query += "VARCHAR(" 
            
        self.path.append( name ) 
        self.cur_data = '' 
    
    def end_element( self, name): 
        path = "/" . join( self.path ) 
        if path == 'Media/Table/Name': 
            self.query += self.cur_data + "(" 
        
        if path == 'Media/Table/FixedLength/FixedColumn/Name': 
            self.add_seperator() 
            self.query += self.cur_data + " " 
                    
        if path == 'Media/Table/FixedLength/FixedColumn' + \ 
            '/FixedRange/Length': 
            self.query += self.cur_data 

        if path == 'Media/Table/FixedLength/FixedColumn': 
            self.query += ")" 

        if path == 'Media/Table': 
            self.query += ")" 

        del self.path[-1] 
    
    def char_data( self, data): 
        self.cur_data += data 

    def get_query( self ): 
        return self.query 


r = Reader() 
r.read( 'test.xml' ) 
query = r.get_query().encode('latin-1') 

connection = MySQLdb.connect( 
    host='localhost', 
    user='root', 
    passwd = '', 
    db = 'test'  #Wichtig, muss exisieren 
) 
    
cursor = connection.cursor() 

try: 
    print "Start Query:\n%s" % query 
    print repr(query)

    cursor.execute( query ) 

    connection.commit() 
except MySQLdb.Error, e: 
    connection.rollback() 
    
    print "Fehler: %s" % str(e) 
else: 
    print "Query erfolgreich!"
So bei den beiden Printanweisungen erhalt ich folgendes:

CREATE TABLE stat (DAT INTEGER(8), GER VARCHAR(5))
'CREATE TABLE stat (DAT INTEGER(8), GER VARCHAR(5))'

Genau wie im ersten Skript.

Ich denke das ist der einzige Ansatz drauf zu kommen. Ich weiß ich nerv schon nen
bißchen. Aber das ist ziemlich seltsam. Wie ist das zu erklaeren? Habt ihr noch weitere
Tipps zur Spurensuche?

MFG

Sarah
Sarah

Montag 22. August 2005, 18:56

Hallo,

Ich habs endlich gefunden woran es hängt. Und zwar gibt es Probleme bei Feldern die ein Q enthalten. MYSQL selbst lässt aber Felder mit Q zu. Also muss es ja bei Python liegen oder? Wie kann ich das Problem lösen das auch Q's akzeptiert werden?
Prgchild kannst du nochmal gucken. Bei deinem Skript und der test.xml da mal nen Feld mit Q einfügen?

MFG

Sarah
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Montag 22. August 2005, 19:58

Mit Q? Probleme? In Python ist Q keine Escape Sequenz, also wird wie jedes andere Zeichen behandelt. Wenn du die Meldung SQL Syntax Fehler bekommst, dann hast du ein Problem mit deinem SQL Query und nicht mit Python.

Folgende XML Datei klappt ohne Probleme, mit dem Script von mir oben.

Code: Alles auswählen

<?xml version="1.0"?>
<Media>
<Name>CD Nummer 1</Name>
<Table>
<URL>Test.ASC</URL>
<Name>daten</Name>
<Description>...</Description>

<!-- Spezifiziert den Dezimaltrenner -->
<DecimalSymbol>,</DecimalSymbol>
<SkipNumBytes>97</SkipNumBytes>
<FixedLength>
<FixedColumn>
<Name>NUMMER</Name>
<Numeric/>
<FixedRange>
<From>97</From>
<Length>4</Length>
</FixedRange>
</FixedColumn>
<FixedColumn>
<Name>Name_mit_Q</Name>
<AlphaNumeric/>
<FixedRange>
<From>101</From>
<Length>12</Length>
</FixedRange>
</FixedColumn>

</FixedLength>

</Table>
</Media>
Ich würde dir empfehlen, dass du einen möglichst kurzes Script schreibst, indem dein Problem auftaucht. Das kannst du dann hier posten.
Antworten