写数据框到postgres数据库
问题描述:
我想写一个熊猫数据框到postgres表。我做一个连接到数据库如下:写数据框到postgres数据库
import psycopg2
import pandas as pd
import sqlalchemy
def connect(user, password, db, host='localhost', port=5432):
'''Returns a connection and a metadata object'''
url = 'postgresql://{}:{}@{}:{}/{}'
url = url.format(user, password, host, port, db)
# The return value of create_engine() is our connection object
con = sqlalchemy.create_engine(url, client_encoding='utf8')
# We then bind the connection to MetaData()
meta = sqlalchemy.MetaData(bind=con, reflect=True)
return con, meta
con, meta = connect('user_name', 'password', 'db_name', host='host_name')
当我从一个已填充的表中读取,它工作正常:
df = pd.read_sql("SELECT * FROM db.table_name limit 10",con=con)
print df
我希望能够写DF到表。为了测试这个,我有一个名为'test'的临时表,其中有两个字段名称和年龄。
# create a temp df
table = [['name', 'age'], ['nameA' , 20], ['nameB', 30]]
headers = table.pop(0)
df = pd.DataFrame(table, columns=headers)
# write to db
df.to_sql('db.test', con, if_exists = 'replace', index=False)
我再检查是否填充临时表:
df = pd.read_sql("SELECT * FROM db.test limit 10",con=con)
print df
我得到一个空的数据帧!当我使用df.to_sql时没有错误,但没有任何内容写入数据库(?)。我错过了什么,如何解决这个问题?
版本:
Pandas: 0.19.2
Sqlachemy: 1.1.10
Postgres: 9.4.9
答
我还没有想通了,为什么df.to_sql
没有写表。写使用pd.io.sql.SQLDatabase
表我的测试情况下工作:
meta = sqlalchemy.MetaData(con, schema='db_name')
meta.reflect()
pdsql = pd.io.sql.SQLDatabase(con, meta=meta)
pdsql.to_sql(df, 'test', if_exists='replace')
我不会考虑这个问题的解决 - 我很乐意接受更好的解决方案,或带来一个封闭一个答案,为什么df.to_sql()并不像预期的那样。
尽量不要在表名中使用句号。 – Parfait
@Parfait,你能详细说明你的意思吗?你的意思是在'db.test'吗?它指向'db'模式下名为'test'的表。 – Krishna
但您连接到连接引擎中的* db *模式。这是多余的,可能会影响表格的创建。只需参考*测试*。 – Parfait