SQLAlchemy CONCAT

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Moin,

ich bräuchte mal etwas Hilfe bei einem Statement in SQLAlchemy.

In MySQL sieht das Statement wie folgt aus

Code: Alles auswählen

SELECT * FROM `kunde` WHERE CONCAT( `anrede` , `nachname` ) LIKE '%Testbestellung%'
Wie sieht das ganze in SQLAlchemy aus?
Müsste wohl so oder eher so in der Art aussehen, glaube ich

Code: Alles auswählen

testorder = session.query(accounting).concat((accounting.vorname, accounting.nachname).ilike("%Testbestellung%"))
Hoffe die Frage ist einigermaßen Verständlich,
Part 1: Wie muss das sqlachemy query aussehen
Part 2: Was muss ich dafür importieren concat oder so etwas in der Art gibt es nicht, eben so wenig wie konkreten Beispielcode.

Hoffe hier kann mir kurz Jemand unter die Arme greifen.
BlackJack

@taake: Also so grundsätzlich gibt es doch Beispiele wie Abfragen über das ORM mit einem `Session`-Objekt funktionieren. Und aus den Operatoren ``==``, ``!=``, ``<``, ``>`` und so weiter könnte man auch ableiten das ``+`` funktionieren könnte. Und das tut es auch:

Code: Alles auswählen

In [37]: print session.query(Accounting).filter((Accounting.vorname + ' ' + Acco
    ...: unting.nachname).like('%Something%'))
SELECT accounting.id AS accounting_id, accounting.vorname AS accounting_vorname, accounting.nachname AS accounting_nachname 
FROM accounting 
WHERE (concat(concat(accounting.vorname, %s), accounting.nachname)) LIKE %s
Ansonsten gibt's im `sql.functions`-Untermodul auch eine `concat()`-Funktion:

Code: Alles auswählen

In [42]: print session.query(Accounting).filter(sa.sql.functions.concat(Accounti
    ...: ng.vorname, ' ', Accounting.nachname).like('%Something%'))
SELECT accounting.id AS accounting_id, accounting.vorname AS accounting_vorname, accounting.nachname AS accounting_nachname 
FROM accounting 
WHERE concat(accounting.vorname, %s, accounting.nachname) LIKE %s
Falls es Funktionen nicht gibt, kann man sich die ”generisch” mit `sql.func` erstellen. Ich würde aber in diesem Fall bei ``+`` bleiben, denn `concat()` ist nicht SQL-Standard und ``+`` wird passend zur Datenbank übersetzt. Standard wäre der ``||``-Operator.
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

@BlackJack: Vielen Dank für die prompte Hilfe - und ja wieder einmal hast du wohl recht ;)
Antworten