2016-11-18 14 views
6

Cụ thể là tôi muốn gọi hàm Postgres levenshtein. Tôi muốn viết các truy vấn ngọn lửa trở lại từ tương tự với từ 'tương tự', tức là tương đương với:gọi hàm SQL từ Blaze

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

Trong Blaze này sẽ giống như

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

nhưng levenshtein không phải là được định nghĩa trong bất kỳ mô-đun nào tôi đang nhập ở phía trăn. Ở đâu/làm cách nào để nhận định dạng levenshtein để sử dụng trong các biểu thức Blaze ở phía Python?


tôi đã tìm thấy các gói sqlalchemy.sql.func cung cấp Python xử lý cho các chức năng SQL để sử dụng với SQLAlchemy, nhưng những không có tác dụng trong các biểu thức Blaze. Có một gói Blaze tương đương hay làm cách nào tôi có thể sử dụng sqlalchemy.sql.func.levenshtein bên trong biểu thức Blaze?

+1

Lưu ý rằng tôi không quen thuộc với Blaze.Tuy nhiên, tôi mong đợi sự hỗ trợ rõ ràng cho hàm 'levenshtein' là không chắc vì nó không phải là một phần của ngôn ngữ lõi PostgreSQL, mà là một phần mở rộng từ mô-đun' fuzzystrmatch'. Vì vậy, có lẽ những gì bạn thực sự cần biết là làm thế nào để mở rộng các biểu thức Blaze để hỗ trợ các hàm SQL tùy chỉnh. – beldaz

+1

http://stackoverflow.com/a/33483264/290182 dường như đề xuất hỗ trợ cho UDF (và vì vậy có lẽ cũng là mô-đun mở rộng) hiện không có sẵn, mặc dù có thể xuất hiện. – beldaz

Trả lời

1

Blaze chỉ là giao diện người dùng; và tái cơ cấu và sau đó cung cấp truy vấn cho SQL Backend, thu thập dữ liệu từ DB của bạn.

From the doku:

gì hoạt động làm việc trên cơ sở dữ liệu SQL? Hầu hết các thao tác dạng bảng, nhưng không phải tất cả. SQLAlchemy dịch là một ưu tiên cao. Lỗi bao gồm các hoạt động của mảng như các sản phẩm cắt và chấm không có ý nghĩa trong SQL. Ngoài ra, một số thao tác như truy cập datetime vẫn chưa được hỗ trợ thông qua SQLAlchemy. Cuối cùng một số cơ sở dữ liệu, như SQLite, có hỗ trợ giới hạn cho các hàm toán học phổ biến như tội lỗi.

Blaze được thiết kế để quên đi phần phụ trợ và có cú pháp tương tự/giống nhau cho tất cả các chương trình phụ trợ. Do đó, nó chỉ hỗ trợ các hoạt động phổ biến. Theo tôi, không có khả năng để chỉ định sqlalchemy hoặc postgresql chức năng cho blaze để sử dụng, do đó tôi nghĩ rằng điều này là không thể bởi bây giờ.

... NHƯNG blaze có phiên bản 0.10, đây là loại beta có đóng góp tích cực trong năm qua. Tôi tin tưởng, điều này sẽ được thực hiện trong một thời gian. Bạn luôn có thể theo dõi các thay đổi trong số release notes.

Bổ sung: Để được giải thích thêm về UDF (Hàm do người dùng định nghĩa) trong SQL và làm việc với chúng trong nháy mắt, hãy so sánh link provided by beldaz (rất giống với câu hỏi này).

+0

Tôi không muốn chuyển các chức năng của mình cho backeend. Postgres được hỗ trợ có chức năng 'levenshtein'. Vấn đề của tôi là làm thế nào để xây dựng một truy vấn blaze tocall chức năng phụ trợ, hoặc nói chung hơn nếu một số phụ trợ thực hiện một chức năng mới làm thế nào để tham khảo nó trong blaze mà không nhận được lỗi undefined –

+0

Yeah, tất nhiên. Có lẽ tôi đã viết không rõ ràng. Tôi chắc chắn có nghĩa là bạn muốn vượt qua các chức năng sql thông qua ngọn lửa để các trình điều khiển sql. Nhưng tôi nghĩ rằng điều này là không thể bây giờ ... –

+1

Cảm ơn, tôi hiểu lầm. Điều đó trả lời câu hỏi của tôi. –

2

PyPi là bạn của bạn. Tìm kiếm ở đó tìm thấy gói python-Levenshtein . Nếu bạn đang ở trên các cửa sổ và muốn có một phiên bản được biên dịch trước, hãy sử dụng Christoph Gohlke's wheel (các bản dựng của anh ấy an toàn, đáng tin cậy và chính xác; các bản dựng khó sử dụng thư viện MKL, vì vậy chúng cũng nhanh quá!).

+0

Tôi không theo sau một hàm thực sự thực hiện khoảng cách levenshtein trong Python. Tôi cần một hàm Python sẽ được Blaze dịch sang lệnh levenshtein bên trong truy vấn SQL được tạo ra. –

+0

Xin lỗi, tôi có ấn tượng rằng bạn đang tìm kiếm việc thực hiện khoảng cách levenshtein trong Python. Có vẻ như bạn sẽ cần sử dụng chức năng SQLAlchemy cấp thấp hơn để thực hiện việc này theo cách bạn muốn. – cco

1

Nếu bạn muốn xem những từ này và thực hiện một số thao tác dễ dàng trên chúng, bạn có thể thử tải dữ liệu đã lọc vào Blaze từ truy vấn Postgres.

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

Nhưng tại sao bạn lại muốn làm điều đó? Đối với tôi, tính năng quan trọng của ngọn lửa không phải là tải toàn bộ cơ sở dữ liệu do vấn đề bộ nhớ ... Tôi muốn thực hiện nhiều truy vấn phức tạp hơn mà không cần phải viết các hàm sql, nhưng bằng cách viết cú pháp python chung. Đó là (imo) trường hợp người dùng, không thao tác với dữ liệu đã tải. –

+0

Tôi đoán đôi khi cranking giao diện Python để SQL không cung cấp cho bạn sự linh hoạt như vậy và đòi hỏi nhiều workaround sau đó chỉ cần cung cấp cho công việc này để SQL. Bạn không phải tải tất cả các chuỗi để DB, bạn có thể tải chúng bằng thư để phân phối các yêu cầu bộ nhớ theo thời gian. –