【问题标题】:Getting data from table in database从数据库中的表中获取数据
【发布时间】:2015-03-20 17:47:32
【问题描述】:

我想从postgresql 数据库中提取数据并在脚本中使用该数据(以数据框格式)。这是我的初步尝试:

from pandas import DataFrame
import psycopg2

conn = psycopg2.connect(host=host_address, database=name_of_database, user=user_name, password=user_password)

cur = conn.cursor()

cur.execute("SELECT * FROM %s;" % name_of_table)

the_data = cur.fetchall()

colnames = [desc[0] for desc in cur.description]

the_frame = DataFrame(the_data)
the_frame.columns = colnames

cur.close()
conn.close()

注意:我知道我不应该使用“字符串参数插值 (%) 将变量传递给 SQL 查询字符串”,但这对我来说非常有用。

会有更直接的方法吗?

编辑:这是我从所选答案中使用的内容:

import pandas as pd
import sqlalchemy as sq

engine = sq.create_engine("postgresql+psycopg2://username:password@host:port/database")

the_frame = pd.read_sql_table(name_of_table, engine)

【问题讨论】:

    标签: python postgresql pandas dataframe psycopg2


    【解决方案1】:

    Pandas 可以直接从 Postgres 加载数据:

    import psycopg2
    import pandas.io.sql as pdsql
    
    conn = psycopg2.connect(...)
    
    the_frame = pdsql.read_frame("SELECT * FROM %s;" % name_of_table, conn)
    

    如果您有最近的 pandas (>=0.14),您应该使用带有 sqlalchemy 引擎的 read_sql_query/tableread_frame 已弃用):

    import pandas as pd
    import sqlalchemy
    import psycopg2
    
    engine = sqlalchemy.create_engine("postgresql+psycopg2://...")
    
    the_frame = pd.read_sql_query("SELECT * FROM %s;" % name_of_table, engine)
    the_frame = pd.read_sql_table(name_of_table, engine)
    

    【讨论】:

    • 您不再需要更深入的导入。 pandas.read_sql_query 现在可以从顶级导入中获得。
    • 还有,pandas.read_sql_table,我相信它会更好地为 OP 服务
    • @PaulH:谢谢。不过,我会保留我的答案,以避免依赖非常新的 Pandas(我个人的 Pandas 对read_sql_query 来说太旧了,而且还不算旧)。
    • @JohnZwinck 我添加了 Paul H 的建议(但留下了旧的,所以你都有),可以吗?如果您愿意,我也可以将其作为单独的答案
    • @JohnZwinck 如果我使用create_engine('postgresql+psycopg2://postgres@ip_address/table_name'),对pd.read_sql_table('table_name', engine) 的调用将返回NotImplementedError“read_sql_table 仅支持 SQLAlchemy 可连接”。我测试了engine.has_table('table_name'),它返回 true。为什么 Pandas 认为我没有使用可连接的 sqlalchemy?
    【解决方案2】:

    这是另一种方法:

        # run sql code
        result = conn.execute(sql)   
    
        # Insert to a dataframe
        df = DataFrame(data=list(result), columns=result.keys())
    

    【讨论】:

    • 请注意,这会浪费地构建一个不需要的列表。如果表很大,那会影响性能。
    • 不过,您可以使用df = DataFrame(iter(result), columns=result.keys()),这并不那么浪费。
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 2013-08-29
    • 2020-09-18
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多