从数据库中的表中获取数据

时间:2015-01-22 02:11:29

标签: python postgresql pandas dataframe psycopg2

我想从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)

2 个答案:

答案 0 :(得分:15)

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)

答案 1 :(得分:2)

这是另一种方法:

    # run sql code
    result = conn.execute(sql)   

    # Insert to a dataframe
    df = DataFrame(data=list(result), columns=result.keys())