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

8

在写入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个回答

10

从熊猫文档中;

"您还可以使用execute()运行一个不需要创建数据帧的简单查询。这对于不返回值的查询非常有用,例如INSERT。这在功能上等同于在SQLAlchemy引擎或db连接对象上调用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)

其中"engine"是SQLAlchemy数据库对象(上面的"database"是OP的)。 省略Vacuum也可以,只会减少sqlite文件的大小(在我的代码中很少使用表删除部分)。


我收到了 InternalError: (psycopg2.errors.ActiveSqlTransaction) VACUUM 无法在事务块内运行 的错误。 - tbrodbeck

8

您应该能够从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()将其保存在内存中,而无需编写文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接