Seite 1 von 1

Query an Firebird db Syntax

Verfasst: Montag 29. November 2021, 14:10
von cbesi
Hallo zusammen,

ich habe einen query welcher im SQL Manager auch funktioniert. Da habe ich mir nix böses gedacht, wollte diesen mit firebirdsql auch ausführen.

Leider funktioniert es nicht immer invalid Syntax:

vielleicht kann mir jemand helfen wie ich an der Stelle weiter komme.

Code: Alles auswählen

import json
#import datetime
#import requests
import firebirdsql
#import sys
#import glob, os

### Parameter für Datenbank aus json lesen
with open('db.json', encoding="utf8") as json_file:
    data = json.load(json_file)

#### Verbindung zur Firebird Datenbank herstellen
conn = firebirdsql.connect(
    host=(data['DB_Path']['Server']),
    database=(data['DB_Path']['Pfad']),
    port=(data['DB_Path']['Port']),
    user=(data['DB_Path']['User']),
    password=(data['DB_Path']['Pass'])
)
query = 'Select Name, Vorname, Datum, Helfernr From (Select tZ.ZeitraumID, tZ.Datum, tZ.Anmelden, tHZ.Helfernr, tHZ.HelferID, tH.Name, tH.Vorname From Zeitbuchungen tZ Left Join Helfer_zeitraeume tHZ On tZ.ZEITRAUMID = tHZ.ID Left Join Helfer tH On tHZ.helferid = tH.ID Where Cast(tZ.Datum As Date) = (select cast('Now' as date) from rdb$database)  And tZ.Anmelden = 1) t Group By Name, Vorname, Datum, Helfernr'

#query = "Select * from Feiertage"
cur = conn.cursor()
cur.execute(query)
print (cur.fetchall())

Re: Query an Firebird db Syntax

Verfasst: Montag 29. November 2021, 14:18
von sparrow
Ein guter Hinweis wäre die Fehlermeldung.

Re: Query an Firebird db Syntax

Verfasst: Montag 29. November 2021, 14:18
von rogerb
@cbesi,

du verschachtelst Anführungszeichen in einander. Das führt zu dem Syntaxfehler:
query muss außen die doppelten Anführungszeichen haben, damit die inneren einfachen Anführungszeichen nicht als string-Ende interpretiert werden:

Code: Alles auswählen

query = "Select Name, Vorname, Datum, Helfernr From (Select tZ.ZeitraumID, tZ.Datum, tZ.Anmelden, tHZ.Helfernr, tHZ.HelferID, tH.Name, tH.Vorname From Zeitbuchungen tZ Left Join Helfer_zeitraeume tHZ On tZ.ZEITRAUMID = tHZ.ID Left Join Helfer tH On tHZ.helferid = tH.ID Where Cast(tZ.Datum As Date) = (select cast('Now' as date) from rdb$database)  And tZ.Anmelden = 1) t Group By Name, Vorname, Datum, Helfernr"
Ob es eine gute Idee ist die query überhaupt so als string zusammenzubauen ist noch ein anderes Thema...

Re: Query an Firebird db Syntax

Verfasst: Montag 29. November 2021, 14:39
von cbesi
Danke schon mal:

Der Query scheint nun gesendet zu werden,

ich bekomme nun noch diesen Fehler:



Traceback (most recent call last):
File "xxx/PycharmProjects/corona_abgleich_dw/coronaabgleich.py", line 25, in <module>
print (cur.fetchall())
File "xxx\AppData\Local\Programs\Python\Python38-32\lib\site-packages\firebirdsql\fbcore.py", line 389, in fetchall
return [tuple(r) for r in self._fetch_records]
File "xxx\AppData\Local\Programs\Python\Python38-32\lib\site-packages\firebirdsql\fbcore.py", line 389, in <listcomp>
return [tuple(r) for r in self._fetch_records]
File "xxx\AppData\Local\Programs\Python\Python38-32\lib\site-packages\firebirdsql\fbcore.py", line 225, in _fetch_generator
(rows, more_data) = connection._op_fetch_response(stmt.handle, stmt.xsqlda)
File "xxx\AppData\Local\Programs\Python\Python38-32\lib\site-packages\firebirdsql\wireprotocol.py", line 950, in _op_fetch_response
r = x.value(raw_value)
File "xxx\AppData\Local\Programs\Python\Python38-32\lib\site-packages\firebirdsql\xsqlvar.py", line 157, in value
return self.bytes_to_str(raw_value)
File "xxx\AppData\Local\Programs\Python\Python38-32\lib\site-packages\firebirdsql\wireprotocol.py", line 242, in bytes_to_str
return b.decode(charset_map.get(self.charset, self.charset))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf3 in position 1: invalid continuation byte

Re: Query an Firebird db Syntax

Verfasst: Montag 29. November 2021, 14:56
von rogerb
Jetzt muss ich raten: Es sieht so aus als, könnte die Rückgabe von fetchall() nicht utf8-decodiert werden. Verwendet die Datenbank eine andere Codierung?

Re: Query an Firebird db Syntax

Verfasst: Montag 29. November 2021, 15:08
von cbesi
In der Datenbank steht Default Character Set = NONE

Re: Query an Firebird db Syntax

Verfasst: Montag 29. November 2021, 15:18
von cbesi
charset='WIN1252' im Connection String löst mein Problem....

vielen Dank für die Hilfe....