使用 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 数据框的主要内容,如果未能解决你的问题,请参考以下文章

Postgresq9.6主从部署

PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host

无法从 sqlalchemy 插入到 mysql

使用 SQLAlchemy 从 PostgreSQL 行对象中获取单个值

使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据框

使用 SQLAlchemy 从反射表中删除的行