Query an Firebird db Syntax

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

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())
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Ein guter Hinweis wäre die Fehlermeldung.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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...
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

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
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

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?
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

In der Datenbank steht Default Character Set = NONE
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

charset='WIN1252' im Connection String löst mein Problem....

vielen Dank für die Hilfe....
Antworten