2015-01-11 12 views
24

Tôi muốn truy vấn cơ sở dữ liệu PostgreSQL và trả về kết xuất dưới dạng một khung dữ liệu Pandas.Trả về dữ liệu Pandas từ truy vấn PostgreSQL với sqlalchemy

tôi sử dụng sqlalchemy để tạo ra một kết nối các cơ sở dữ liệu:

from sqlalchemy import create_engine 
engine = create_engine('postgresql://[email protected]:5432/mydb') 

tôi viết một dataframe Pandas vào một bảng cơ sở dữ liệu:

i=pd.read_csv(path) 
i.to_sql('Stat_Table',engine,if_exists='replace') 

Dựa trên docs, trông giống như pd.read_sql_query () nên chấp nhận công cụ SQLAlchemy:

a=pd.read_sql_query('select * from Stat_Table',con=engine) 

Nhưng nó t có lỗi:

ProgrammingError: (ProgrammingError) relation "stat_table" does not exist 

Tôi đang sử dụng phiên bản Pandas 0.14.1.

Cách thích hợp để thực hiện việc này là gì?

Trả lời

32

Bạn bị các vấn đề về độ nhạy (in) nhạy cảm với PostgreSQL. Nếu bạn trích dẫn tên bảng trong truy vấn, nó sẽ làm việc:

df = pd.read_sql_query('select * from "Stat_Table"',con=engine) 

Nhưng cá nhân tôi, tôi sẽ tư vấn để chỉ luôn luôn sử dụng tên bảng chữ thường (và tên cột), cũng có khi viết bảng để các cơ sở dữ liệu ngăn chặn các vấn đề như vậy.


Từ các tài liệu PostgreSQL (http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS):

Quoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case

Để giải thích thêm một chút: bạn đã viết một bảng với tên Stat_Table cơ sở dữ liệu (và SQLAlchemy sẽ báo tên này, vì vậy nó sẽ được viết là "Stat_Table" trong cơ sở dữ liệu postgres). Khi thực hiện truy vấn 'select * from Stat_Table' tên bảng không được bỏ phiếu sẽ được chuyển đổi thành chữ thường stat_table và vì vậy bạn sẽ nhận được thông báo rằng bảng này không được tìm thấy.

Xem ví dụ: Are PostgreSQL column names case-sensitive?

+0

@AseemHegshetye điều này hoàn toàn không liên quan đến câu hỏi gốc hoặc câu trả lời này, vì vậy hãy đặt câu hỏi mới – joris

2

Các thông báo lỗi được nói với bạn rằng một bảng tên là:

stat_table 

không tồn tại (một quan là một bảng trong postgres nói). Vì vậy, tất nhiên bạn không thể chọn các hàng từ nó. Kiểm tra db của bạn sau khi thực hiện:

i.to_sql('Stat_Table',engine,if_exists='replace') 

và xem bảng có tên đó được tạo trong db của bạn không.

Khi tôi sử dụng tuyên bố đọc của bạn:

df = pd.read_sql_query('select * from Stat_Table',con=engine) 

tôi nhận được dữ liệu trở lại từ một postgres db, vì vậy không có gì sai với nó.

+1

Cảm ơn. Kiểm tra và bảng đã thực sự được tạo ra. Giống như @joris cho biết, đó là một vấn đề nhạy cảm trong bảng tên bảng: Tôi đã viết lại bảng: 'i.to_sql ('stat_table', engine, if_exists = 'replace')' và sau đó nó hoạt động: 'a = pd.read_sql_query ('select * from stat_table', engine) ' – lmart999

+0

@ Imart999, Khi tôi viết: ** xem bảng có tên đã được tạo trong db ** - ** của bạn tên ** đã đề cập đến tên trong thông báo lỗi, đó là 'stat_table'. Tên thông báo lỗi là tên có liên quan - với bất kỳ lỗi nào bạn nhận được. Và bởi vì python KHÔNG BAO GIỜ mắc lỗi, lỗi có nghĩa là mã của bạn KHÔNG BAO GIỜ tạo ra một bảng có tên là 'stat_name'. Xem cách tôi đăng tên bảng 'stat_name' trong đoạn riêng của nó và đánh dấu nó - đó là nghĩa vụ phải hướng sự chú ý của bạn đến nó. – 7stud

+0

Phải, tôi hiểu rồi. Tôi đã thấy cả hai phản hồi cùng một lúc (đã ngoại tuyến). Tôi thấy rằng câu trả lời của bạn đang dẫn tôi đến cùng một câu trả lời (ví dụ: đảm bảo bảng có tên là 'stat_table' được viết) mà @joris đã nêu rõ ràng (ví dụ: trường hợp nhạy cảm có vấn đề). Đánh giá cao phản hồi. – lmart999

Các vấn đề liên quan