2015-10-20 43 views
2

我想在熊貓數據幀寫一些數據之前刪除表(如果存在):當我沒有表對象時,如何在SQLAlchemy中刪除表?

def store_sqlite(in_data, dbpath = 'my.db', table = 'mytab'): 
    database = sqlalchemy.create_engine('sqlite:///' + dbpath) 
    ## DROP TABLE HERE 
    in_data.to_sql(name = table, con = database, if_exists = 'append') 
    database.close() 

的SQLAlchemy的文檔都指向一個Table.drop()對象 - 我將如何創建對象,或等價有另一種方法來放棄這個表?

注意:我不能只使用if_exists = 'replace'作爲輸入數據實際上是我遍歷DataFrames的字典 - 我已經壓抑了透明度(我希望)代碼。

回答

2

您應該能夠從您的SQLAlchemy的發動機

創建遊標
import sqlalchemy 

engine = sqlalchemy.create_engine('sqlite:///' + dbpath) 
connection = engine.raw_connection() 
cursor = connection.cursor() 
command = "DROP TABLE IF EXISTS {};".format(table) 
cursor.execute(command) 
connection.commit() 
cursor.close() 

# Now you can chunk upload your data as you wish 
in_data.to_sql(name=table, con=engine, if_exists='append') 

如果要加載大量數據到你的數據庫,你可以用大熊貓to_csv()更快的找到它,SQL的copy_from功能。您也可以使用StringIO()將其保存在內存中並且不得不寫入文件。

6

來自熊貓文檔;

「您也可以在不創建帶有execute()的數據框的情況下運行普通查詢,這對於不返回值的查詢(如INSERT)非常有用,這在功能上等同於調用SQLAlchemy引擎或db連接對象「。

http://pandas.pydata.org/pandas-docs/version/0.18.0/io.html#id3

所以我做到這一點;

from pandas.io import sql 
sql.execute('DROP TABLE IF EXISTS %s'%table, engine) 
sql.execute('VACUUM', engine) 

其中「引擎」是SQLAlchemy數據庫對象(OP的上面的「數據庫」)。真空是可選的,只是減小了sqlite文件的大小(我在我的代碼中很少使用表格拖放部分)。