007.PGSQL-python讀取txt檔案,將資料轉化為dataFrame,dataFrame資料插入到pgsql; dataframe去掉索引,指定列為索引;python讀取pgsql資料,讀取資料庫表導成excel
python讀取txt檔案,將資料轉化為dataFrame,dataFrame資料插入到pgsql
1.pd.io.sql.to_sql(dataframe,'table_name',con=conn,schema='w_analysis',if_exists='append')
2.df.to_sql('test0001', engine,schema='ioc_dw_second', if_exists='append', index=False) #增量入庫
dataframe去掉索引,指定列為索引
#指定某一列為索引
df.set_index('rid',inplace=True)
1. 方法1
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
#檢視檔案
list(open('C:/Users/James Murray/Desktop/test0001.txt'))
#讀取txt
df_news = pd.read_table('C:/Users/James Murray/Desktop/test0001.txt',sep='\s+')
df=pd.DataFrame(df_news)
#指定某一列為索引
df.set_index('rid',inplace=True)
df
# 初始化引擎
connect = create_engine(' postgresql+psycopg2://'+'yonghu'+':'+'mima'+'@ip'+':'+str(duankou) + '/' + 'kuming')
# 寫入資料
pd.io.sql.to_sql(df,'test0001',connect,schema='ioc_dw_second', if_exists='append')
connect.dispose()
2. 方法2
if_exists='replace' #覆蓋入庫
if_exists='append' #增量入庫
import pandas as pd from sqlalchemy import create_engine df_news= pd.read_table('C:/Users/James Murray/Desktop/test0001.txt',sep='\s+') df=pd.DataFrame(df_news) #指定某一列為索引 df.set_index('rid',inplace=True) df engine = create_engine('postgresql+psycopg2://' + 'yonghu' + ':' + 'mima' + '@' + 'ip' + ':' + str(duankou) + '/' + 'kuming') # 配合pandas的to_sql方法使用十分方便(dataframe物件直接入庫) #df.to_sql(table, engine, if_exists='replace', index=False) #覆蓋入庫 # index=False ,索引行不插入表 df.to_sql('test0001', engine,schema='ioc_dw_second', if_exists='append', index=False) #增量入庫
附 :讀取資料1
from string import Template import numpy as np import pandas as pd from sqlalchemy import create_engine #建立連線引擎 engine = create_engine('postgresql+psycopg2://' + 'yonghu' + ':' + 'mima' + '@' + 'xx.xx.xx.xx' + ':' + str(duabkou) + '/' + 'kuming') #sql語句 ===================================== query_sql = """ select * from ioc_dw_second.$arg1 """ ===================================== query_sql = Template(query_sql) # template方法 字串格式化 #表名 tablename = 'test0001' df1 = pd.read_sql_query(query_sql .substitute(arg1=tablename),engine) # 配合pandas的方法讀取資料庫值 df1
附 :讀取資料2
import psycopg2 import openpyxl conn = psycopg2.connect(database='xx',user='xxx',password='xx',host='xx.xx.xx.xx',port='xxx') cur= conn.cursor() cur.execute("select database_name,proc_name,proc_detail from ioc_ods.ud_ioc_proc_beifen limit 1" ) rows = cur.fetchall() for row in rows: print("database_name = ",row[0]) print("proc_name = ",row[1]) print("proc_detail = ",row[2]) print("operation done succcessful") conn.close()
python讀取pgsql資料,讀取資料庫表導成excel
# encoding:utf-8 import psycopg2 import openpyxl from datetime import datetime def database_excel(): # 建立資料庫連線 conn = psycopg2.connect(database='kuming',user='yonghu',password='mima',host='ip',port='duankou') # 讀取資料 cur= conn.cursor() sql = ''' SELECT nspname ,proname , prosrc , CURRENT_TIMESTAMP as update_time FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_proc p ON pronamespace = n.oid WHERE nspname in ( 'ioc_ods', 'ioc_support','ioc_standard','ioc_dm','ioc_dw','ioc_theme' )order by nspname ''' cur.execute(sql) rows = cur.fetchall() wb = openpyxl.Workbook() wb.create_sheet('SHEET1',0) sheet = wb.get_sheet_by_name("SHEET1") today = datetime.today() today_date = datetime.date(today) myAlphbet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'] # 各列對應 column_name = ['庫名','儲存過程名稱', '儲存過程','更新時間'] path = 'E:\\龍崗IOC10.101.27.15PGsql儲存過程備份\\備份proc\\' # 列名 for i in range(len(column_name)) : loc = myAlphbet[i]+str(1) sheet[loc] = column_name[i] for i in range(len(rows)) : for j in range(len(rows[i])): loc = myAlphbet[j]+str(i+2) sheet[loc] = rows[i][j] wb.save(path+'SHEET'+'_'+str(today_date)+'.xlsx') if __name__ == '__main__': database_excel() print("succeed")
當我們利用pandas處理完資料後,有時可能需要將處理好的資料儲存到資料庫中,這時需要利用sqlalchemy。
SQLAlchemy“採用簡單的Python語言,為高效和高效能的資料庫訪問設計,實現了完整的企業級持久模型”。
利用sqlalchemy,可以講pandas型別的格式資料儲存到資料庫中,但是在使用過程中還是有很多坑的,下面簡單介紹一下如何使用:
1:
import pandas as pd
from sqlalchemy import create_engine
匯入模組中的create_engine,需要利用它來進行連線資料庫
2:
conn = create_engine('mysql+mysqldb://root:123456@localhost:3306/w_analysis?charset=utf8')
建立連線,利用create_engine
3:
pd.io.sql.to_sql(dataframe,'table_name',con=conn,schema='w_analysis',if_exists='append')
利用pd的io中的sql的to_sql方法進行匯入(記住不是pd的to_sql)
4:
conn.dispose()
關閉連線
create_engine引數說明:
(mysql+mysqldb://使用者名稱:密碼@localhost:埠/資料庫名?編碼)? ? 設定資料庫的編碼方式,可以防止latin字元不識別而報錯
to_sql引數說明:
(資料, '表名', con=連線鍵, schema='資料庫名', if_exists='操作方式')? ? 操作方式有append、fail、replace
append:如果表存在,則將資料新增到這個表的後面
fail:如果表存在就不操作
replace:如果存在表,刪了,重建
!!!這裡提醒一下可能出現的錯誤:
ModuleNotFoundError: No module named 'MySQLdb'請看這裡
注:pd 1.9以後的版本,除了sqllite,均需要通過sqlalchemy來設定