2017-05-30 87 views
2

我想寫一個熊貓數據框到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 
+1

儘量不要在表名中使用句號。 – Parfait

+0

@Parfait,你能詳細說明你的意思嗎?你的意思是在'db.test'嗎?它指向'db'模式下名爲'test'的表。 – Krishna

+1

但您連接到連接引擎中的* db *模式。這是多餘的,可能會影響表格的創建。只需參考*測試*。 – Parfait

回答

1

我還沒有想通了,爲什麼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()並不像預期的那樣。