2015-04-08 25 views
44

Chủ đề này đã không được giải quyết trong một thời gian, ở đây hoặc ở nơi khác. Có một giải pháp chuyển đổi SQLAlchemy <Query object> thành DataFrame gấu trúc không?SQLAlchemy ORM chuyển đổi sang gấu trúc DataFrame

Pandas có khả năng sử dụng pandas.read_sql nhưng điều này yêu cầu sử dụng SQL thô. Tôi có hai lý do để tránh nó: 1) Tôi đã có tất cả mọi thứ bằng cách sử dụng ORM (một lý do tốt trong và của chính nó) và 2) Tôi đang sử dụng danh sách python như một phần của truy vấn (ví dụ: .db.session.query(Item).filter(Item.symbol.in_(add_symbols), nơi Item là của tôi mô hình lớp học và add_symbols là một danh sách). Điều này tương đương với SQL SELECT ... from ... WHERE ... IN.

Có điều gì không?

Trả lời

82

Dưới đây nên làm việc trong hầu hết các trường hợp:

df = pd.read_sql(query.statement, query.session.bind) 

Xem pandas.read_sql tài liệu hướng dẫn để biết thêm thông tin về các thông số.

+26

Oh. My. Thượng Đế. Chúng tôi đã đi một chặng đường dài. – dmvianna

+0

@van +1 nhưng có thể thực hiện chi tiết hơn một chút. ví dụ. Tôi đã làm 'df = pd.read_sql (truy vấn, truy vấn.bind)' khi 'truy vấn' là một' sqlalchemy.sql.selectable.Select'. Nếu không, tôi nhận đối tượng ''Chọn' không có thuộc tính 'phiên''. – josh

+0

Để sao chép-dán, tôi đã thêm liên kết vào tài liệu trực tiếp trong câu trả lời, bao gồm câu hỏi của bạn: bạn nên cung cấp tham số 'con', có thể là' công cụ' hoặc 'chuỗi kết nối' – van

0

Nếu bạn muốn biên dịch một truy vấn với các thông số và lập luận cụ thể phương ngữ, sử dụng một cái gì đó như thế này:

c = query.statement.compile(query.session.bind) 
df = pandas.read_sql(c.string, query.session.bind, params=c.params) 
21

Chỉ cần để làm cho điều này rõ ràng hơn cho các lập trình viên gấu trúc mới, đây là một ví dụ cụ thể,

pd.read_sql(session.query(Complaint).filter(Complaint.id == 2).statement,session.bind) 

ở đây chúng ta chọn một đơn khiếu nại từ bảng khiếu nại (model SQLAlchemy là khiếu nại) với id = 2

+0

Tôi nghĩ điều này rõ ràng hơn, khi mã được dựa trên ORM. – user40780

+0

OMG! Tôi đã đấu tranh với địa ngục sqlAlchemy rất nhiều. Chỉ cần một lưu ý phụ ở đây: Bạn cũng có thể viết read_sql ('SELECT * FROM TABLENAME', db.session.bind). Cảm ơn. Câu trả lời ở trên đã giúp tôi nhiều hơn cái được chấp nhận. – PallavBakshi

+0

'.statement' làm gì? – cardamom

2

Các giải pháp được lựa chọn không làm việc cho tôi, như tôi vẫn tiếp tục get ting lỗi

AttributeError: 'AnnotatedSelect' object has no attribute 'lower'

tôi thấy làm việc sau đây:

df = pd.read_sql_query(query.statement, engine) 
Các vấn đề liên quan