2016-11-18 39 views
6

W szczególności chciałbym zadzwonić do funkcji Postgres levenshtein. chciałbym napisać blasku zapytanie do powrotu słowa podobne do słowa „podobny”, czyli równowartość:wywoływanie funkcji SQL z Blaze

select word from wordtable where levenshtein(word, 'similar') < 3; 

W Blaze powinno to wyglądać mniej więcej tak

db.wordtable.word[levenshtein(db.wordtable.word, 'similar') < 3] 

ale levenshtein nie jest zdefiniowane w dowolnym module, który importuję po stronie Pythona. Gdzie/jak uzyskać definicję levenshtein do użycia w wyrażeniach Blaze po stronie Pythona?


Znalazłem pakiet sqlalchemy.sql.func który zapewnia Python uchwyty do funkcji SQL do użytku z sqlalchemy, ale te nie działają w wyrażeniach Blaze. Czy istnieje odpowiednik pakietu Blaze lub jak mogę użyć sqlalchemy.sql.func.levenshtein w wyrażeniu Blaze?

+1

Pamiętaj, że nie znam Blaze.Oczekuję jednak, że wyraźne poparcie dla funkcji 'levenshtein' jest mało prawdopodobne, ponieważ nie jest nawet częścią języka podstawowego PostgreSQL, ale raczej rozszerzenie z modułu' fuzzystrmatch'. Więc prawdopodobnie musisz wiedzieć, jak rozszerzyć wyrażenia Blaze, aby obsługiwać niestandardowe funkcje SQL. – beldaz

+1

http://stackoverflow.com/a/33483264/290182 wydaje się sugerować, że wsparcie dla UDF (a więc prawdopodobnie również modułów rozszerzeń) nie jest obecnie dostępne, choć jest to zdecydowanie możliwe. – beldaz

Odpowiedz

1

Blaze to tylko frontend; i przebudowuje, a następnie wysyła zapytanie do Backendu SQL, który zbiera dane z DB.

From the doku:

Jakie operacje pracować na bazach danych SQL? Większość operacji tabelarycznych, ale nie wszystkie. Tłumaczenie SQLAlchemy ma wysoki priorytet. Niepowodzenia obejmują tablice operacje takie jak wycinanie i produkty z kropkami nie mają sensu w SQL. Dodatkowo niektóre operacje, takie jak dostęp do czasu dostępu, jeszcze nie są dobrze obsługiwane przez SQLAlchemy. Wreszcie niektóre bazy danych, takie jak SQLite, mają ograniczone wsparcie dla wspólnych funkcji matematycznych, takich jak grzech.

Blaze ma na celu zapomnieć o zapleczu i mieć podobną/tę samą składnię dla wszystkich backendów. Dlatego obsługuje tylko typowe operacje. Moim zdaniem, nie ma możliwości określenia funkcji sqlalchemy lub postgresql dla użycia blaze, więc myślę, że to już nie jest możliwe.

... ALE Blaze ma wersję 0.10, jest to rodzaj beta z aktywnym wkładem w zeszłym roku. Jestem przekonany, że zostanie to zaimplementowane za jakiś czas. Zawsze możesz śledzić zmiany w release notes.

Dodawanie: Dodawanie: Aby uzyskać więcej informacji na temat funkcji UDF (funkcji zdefiniowanych przez użytkownika) w SQL i pracy z nimi w trybie blasku, porównaj link provided by beldaz (bardzo podobny do tego pytania).

+0

Nie chcę przekazywać moich funkcji do backeend. Postgres ma funkcję 'levenshtein'. Mój problem polega na tym, jak skonstruować zapytanie o blasku, aby dodać funkcję backendu, lub bardziej ogólnie, jeśli jakiś backend implementuje nową funkcję, jak odnieść się do niej w blasku, nie otrzymując nieokreślonych błędów. –

+0

Tak, oczywiście. Może nie napisałem wyraźnie. Z pewnością oznaczało to, że chcesz przekazać funkcje sql za pośrednictwem blaze do sterownika sql. Ale myślę, że to już nie jest możliwe ... –

+1

Dzięki, źle mnie zrozumiałem. To odpowiada na moje pytanie. –

2

jest twoim przyjacielem. Wyszukiwanie tam znajduje pakiet python-Levenshtein . Jeśli jesteś w systemie Windows i chcesz wersji skompilowanej, użyj Christoph Gohlke's wheel (jego kompilacje są bezpieczne, niezawodne i poprawne, kompilacje numpy korzystają z bibliotek MKL, więc też są szybkie!).

+0

Nie jestem po funkcji, która faktycznie realizuje odległość levenshtein w Pythonie. Potrzebuję funkcji Python, która zostanie przetłumaczona przez Blaze na wywołanie levenshtein wewnątrz wygenerowanego zapytania SQL. –

+0

Niestety, odniosłem wrażenie, że szukasz implementacji odległości levenshtein w Pythonie. Wygląda na to, że będziesz musiał użyć funkcjonalności SQLAlchemy na niższym poziomie, aby zrobić to tak, jak chcesz. – cco

1

Jeśli chcesz zobaczyć te słowa i wykonać kilka prostych czynności, możesz spróbować załadować przefiltrowane dane do Blaze z zapytania PostgreSQL.

from blaze import data 
import sqlalchemy as sa 

engine = sa.create_engine('postgresql://...') 
result = engine.execute('''select word from wordtable where levenshtein(word, 'similar') < 3;''') 
rows = result.fetchall() 
wordtable = data(rows) 

# Now you may work with wordtable as a blaze table 
wordtable[wordtable.word.like('a*')] # all words starting with 'a' 
+0

Ale dlaczego miałbyś to robić? Dla mnie kluczową cechą blasku nie jest załadowanie pełnej bazy danych z powodu problemów z pamięcią ... Chcę tworzyć bardziej lub mniej złożone zapytania bez potrzeby pisania funkcji sql, ale z pisaniem we wspólnej składni pythona. To (imo) przypadek użytkownika, aby nie manipulować już załadowanymi danymi. –

+0

Sądzę, że czasami uruchamianie interfejsu Pythona do SQL nie daje takiej elastyczności i wymaga więcej obejścia, a następnie po prostu przekazuj to zadanie do SQL. Nie musisz ładować wszystkich ciągów do DB, możesz ładować je list po literze, aby rozłożyć wymagania pamięciowe w czasie. –