使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据框
Posted
技术标签:
【中文标题】使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据框【英文标题】:Return Pandas dataframe from PostgreSQL query with sqlalchemy 【发布时间】:2015-03-09 04:09:35 【问题描述】:我想查询 PostgreSQL 数据库并将输出作为 Pandas 数据框返回。
我使用“SqlAlchemy”创建了与数据库的连接:
from sqlalchemy import create_engine
engine = create_engine('postgresql://user@localhost:5432/mydb')
我将 Pandas 数据框写入数据库表:
i=pd.read_csv(path)
i.to_sql('Stat_Table',engine,if_exists='replace')
基于docs,看起来 pd.read_sql_query() 应该接受 SQLAlchemy 引擎:
a=pd.read_sql_query('select * from Stat_Table',con=engine)
但是它会抛出一个错误:
ProgrammingError: (ProgrammingError) relation "stat_table" does not exist
我使用的是 Pandas 0.14.1 版。
这样做的正确方法是什么?
【问题讨论】:
【参考方案1】:您被 PostgreSQL 的大小写(输入)敏感性问题所困扰。如果您在查询中引用表名,它将起作用:
df = pd.read_sql_query('select * from "Stat_Table"',con=engine)
但就个人而言,我建议始终使用小写的表名(和列名),在将表写入数据库以防止此类问题时也是如此。
来自 PostgreSQL 文档 (http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS):
引用标识符也使其区分大小写,而未引用的名称总是折叠为小写
再解释一下:您已将名称为Stat_Table
的表写入数据库(sqlalchemy 将引用此名称,因此在 postgres 数据库中将其写为“Stat_Table”)。执行查询'select * from Stat_Table'
时,未加引号的表名将转换为小写stat_table
,因此您会收到未找到该表的消息。
参见例如Are PostgreSQL column names case-sensitive?
【讨论】:
【参考方案2】:在下面给出的熊猫中读取 postgres sql 数据和图片链接
import psycopg2 as pg
import pandas.io.sql as psql
connection = pg.connect("host=localhost dbname=kinder user=your_username password=your_password")
dataframe = psql.read_sql('SELECT * FROM product_product', connection)
product_category = psql.read_sql_query('select * from product_category', connection)
https://i.stack.imgur.com/1bege.png
【讨论】:
【参考方案3】:在这里聚会迟到了,但给你一个完整的例子:
import pandas as pd
import psycopg2 as pg
engine = pg.connect("dbname='my_db_name' user='pguser' host='127.0.0.1' port='15432' password='pgpassword'")
df = pd.read_sql('select * from Stat_Table', con=engine)
您需要运行以下命令来安装 ubuntu 的依赖项:
pip install pandas psycopg2-binary SQLAlchemy
关于该主题的 Pandas 文档here
【讨论】:
【参考方案4】:错误信息告诉你一个表名为:
stat_table
不存在(关系 是 postgres 中的表)。所以,当然你不能从中选择行。执行后检查你的数据库:
i.to_sql('Stat_Table',engine,if_exists='replace')
并查看是否在您的数据库中创建了同名的表。
当我使用你的阅读声明时:
df = pd.read_sql_query('select * from Stat_Table',con=engine)
我从 postgres 数据库中取回数据,所以它没有任何问题。
【讨论】:
谢谢。检查并确实创建了表。就像@joris 说的那样,这是表名区分大小写的问题:我重新编写了表:i.to_sql('stat_table',engine,if_exists='replace')
然后它起作用了:a=pd.read_sql_query('select * from stat_table',engine)
@Imart999,当我写道:查看是否在您的数据库中创建了该名称的表 --该名称指的是该名称在错误消息中,即stat_table
。错误消息名称是相关的 - 与您收到的任何错误有关。因为 python 永远不会出错,所以错误意味着你的代码永远不会创建一个名为stat_name
的表。看看我是如何在它自己的段落中发布表名stat_name
并突出显示它的——这应该会引起你的注意。
好吧,我明白了。我同时看到了两个响应(离线)。我看到您的回复使我得到了与@joris 明确声明的相同答案(例如,确保写入名为stat_table
的表)(例如,区分大小写很重要)。感谢您的回复。
@Imart999,不用担心。当我重新阅读我的答案时,我意识到that name
所指的内容并不完全清楚。我应该省略你的代码行。【参考方案5】:
导入 sqlalchemy 导入 psycopg2
engine = sqlalchemy.create_engine('postgresql://user@localhost:5432/mydb')
您必须指定架构和表格 df = pd.read_sql_query("""select * from "dvd-rental".film""", con=engine)
【讨论】:
以上是关于使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host
使用 SQLAlchemy 从 PostgreSQL 行对象中获取单个值