【问题标题】:Return Pandas dataframe from PostgreSQL query with sqlalchemy使用 sqlalchemy 从 PostgreSQL 查询返回 Pandas 数据框
【发布时间】:2023-04-06 23:24:01
【问题描述】:

我想查询 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 版。

这样做的正确方法是什么?

【问题讨论】:

    标签: python postgresql pandas sqlalchemy


    【解决方案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)

          【讨论】:

            猜你喜欢
            • 2020-06-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-18
            • 2021-09-15
            • 2017-08-23
            • 1970-01-01
            相关资源
            最近更新 更多