当我没有表对象时,如何在SQLAlchemy中删除表?

时间:2015-10-20 06:04:14

标签: python pandas sqlalchemy

我想在Pandas数据帧中写入一些数据之前删除一个表(如果存在):

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 个答案:

答案 0 :(得分:7)

来自熊猫文档;

"您也可以在不使用execute()创建数据框的情况下运行普通查询。这对于不返回值的查询很有用,例如INSERT。这在功能上等同于在SQLAlchemy引擎或数据库连接对象上调用execute。"

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' s"数据库"上面)。 vacuum是可选的,只是减小了sqlite文件的大小(我在代码中不经常使用表删除部分)。

答案 1 :(得分:3)

您应该能够从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')

如果您要将大量数据加载到数据库中,您可能会发现使用pandas'to_csv()和SQL的copy_from函数会更快。您还可以使用StringIO()将其保存在内存中并且必须写入文件。