sqlachemy like statment

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

hey bin gerade dabei etwas mit dem sqlalchemisten rumzuspielen.

hab allerdings ein problem mit like statments, weiß nicht wie ich die am besten integrieren soll, wenn ich es versuche passiert entweder nichts oder das prog klappt zusammen.

das läuft im moment so dass das query wie folgt aussieht.

Code: Alles auswählen

DB_Struck.query.filter_by(csv_nr=form.csv.data).all()
form.csv.daten enthält eine nummer oder eine teilnummer die in der column csv_nr in der db stehen kann.
wie kann ich dort ein like statment formulieren, im moment matched er nur wenn der vollständige suchstring in der db steht.
BlackJack

@horko: Welchen Typ hat denn die Spalte `csv_nr`? LIKE macht ja nur Sinn wenn es sich um eine Zeichenkette handelt. Bei Zahltypen funktioniert das nicht. (Jedenfalls nicht bei den meisten DBMS.)
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

Ist ein einfacher Varchar,
die Daten darin bestehen entweder nur aus Zahlen oder zu teilen sind sie auch durch z.B. ein Minus getrennt.
also z.B. 463432233 oder 34353434-54534
Wollte es ermöglichen auch nach teilen zu suchen und somit alle Übereinstimmungen dazustellen.

Code: Alles auswählen

class DB_Struck(db.Model):
csv_nr = db.Column(db.String(20))
BlackJack

@horko: Na dann ist die Frage wie Du es genau versucht hast. Und welche Fehler da genau kamen. Und hast Du Dir das SQL mal angeschaut das SQLAlchemy an die DB schickt?
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

Also die Anfrage so wie sie im Moment formuliert ist:

Code: Alles auswählen

WHERE csv_nr is %s
Was ich möchte ist

Code: Alles auswählen

Where csv_nr is like %s 
(wie auch immer das korrekte slq statment aussieht)

Bis jetzt waren die Fehlermeldungen der Natur das ich nicht wusste wie ich das Query in ein 'like-query' umformuliere.
Hab like statments nur für verschachtelte Anfragen gefunden und demnach hätte es mit

Code: Alles auswählen

DB_Struck.query.filter_by(csv_nr.like=form.csv.data).all()
eigentlich funktionieren sollen, hat es aber nicht.

Daher hab ich gedacht meld ich mich hier an und frag :)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

SQLAlchemy hat übrigens eine Dokumentation mit Tutorials, in denen Querying erwähnt wird und unter anderem auch übliche Filter Operationen, zu denen LIKE zählt.
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

@DasIch: Danke für den Link, hatte den nicht mehr gefunden war aber genau der den auf den ich mich in meinem post bezogen hatte mit dem

Code: Alles auswählen

DB_Struck.query.filter_by(csv_nr.like=form.csv.data).all()
Wenn ich wie dort beschrieben habe das like dort einbinde:

Code: Alles auswählen

SyntaxError: keyword can't be an expression
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Was du da machst hat auch nichts damit zu tun was in der Dokumentation steht, lies die doch einfach mal.
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

Hab ich jetzt, zumindest zum großteil,
allerdings ist der einzige Unterscheid der mir auffällt das ich keine session benutzte, an die ich das alles binde um sie auszuführen, sondern es direkt mache, aber ob und warum es deswegen nicht klappt bleibt mir weiterhin schleierhaft.
Und daran das ich ein Objekt benutze statt einem Wert sollte es auch nicht scheitern, oder?

Vielleicht komme ich heute Abend dazu das alles nochmals in aller Ruhe zu lesen, aber ob ich besagten Fehler dabei finden werde steht in den Sternen.
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

Okay nochmals gelesen, aber wohl nicht verstanden, da mir der Fehler immer noch nicht bewust ist.

Würde mich über Sachdienliche Hinweise freuen (keine RTFM)
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

horko hat geschrieben:Okay nochmals gelesen, aber wohl nicht verstanden, da mir der Fehler immer noch nicht bewust ist.

Würde mich über Sachdienliche Hinweise freuen (keine RTFM)
Es ist nicht leicht, an dieser Stelle etwas anderes zu sagen als "RTFM genau". Du hast:

Code: Alles auswählen

DB_Struck.query.filter_by(csv_nr.like=form.csv.data).all()
Und in der Dokumentation steht, an der von DasIch verlinkten Stelle:

Code: Alles auswählen

query.filter(User.name.like('%ed%'))
Vergleichen. Dann alles klar?
horko
User
Beiträge: 17
Registriert: Dienstag 1. Oktober 2013, 10:49

Nach langem rumprobieren klappt es halbwegs, allerdings funktioniert das dynamische like noch nicht.
z.B. funktioniert: (Wenn man die genaue Nummer kennt)

Code: Alles auswählen

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine = create_engine('mysql://login:passwd@localhost/datenbank')
Session = sessionmaker(bind=engine)
session = Session()

session.query(DB_Struck).filter(DB_Struck.csv_nr.match(form.csv.data)).all()
auch ein 'hardcodet like klappt.

Code: Alles auswählen

session.query(DB_Struck).filter(DB_Struck.csv_nr.like('%1234567890%')).all()
Ich hätte allerdings gerne etwas mehr flexibilität
sowas in der Art wie

Code: Alles auswählen

session.query(DB_Struck).filter(DB_Struck.csv_nr.like('%%s%' , (form.csv.data))).all()
Python hat allerdings was dagegen, quitiert wird das ganze so:
raise errorclass, errorvalue
OperationalError: (OperationalError) (1210, 'Incorrect arguments to ESCAPE') "SELECT data.data_id AS data_data_id, data.csv AS data_csv \nFROM data \nWHERE data.csv LIKE %s ESCAPE '1234'" ('%%s%',)
Wenn da jetzt noch jemand ein Tipp hätte ...


Edit:

Ich = Manchmal etwas doof: check

Code: Alles auswählen

session.query(DB_Struck).filter(DB_Struck.csv_nr.like('%'+form.csv.data+'%')).all()
Zum Glück hab ich es selbst gemerkt bevor es noch peinlicher wird
Zuletzt geändert von horko am Mittwoch 9. Oktober 2013, 10:34, insgesamt 1-mal geändert.
BlackJack

@horko: Du rätst schon wieder. `like()` nimmt zwar ein zweites Argument, das ist aber das Escape-Zeichen wenn man ein anderes als '%' verwenden möchte. Das sollte so auch in der Dokumentation stehen. Du musst halt der Zeichenkette aus dem Form ein '%' vor- und nachstellen. Das ist mit den grundlegensten Zeichenkettenoperationen machbar. Zum Beispiel die `format()`-Methode auf Zeichenketten.
Antworten