我有可重复尝试用Python中的SQLAlchemy创建表MYTABLENAME
。我通过我的SQL客户端Dbeaver删除了所有表,但是我收到一个表存在的错误
Traceback (most recent call last):
File "/home/hhh/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
context)
File "/home/hhh/anaconda3/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 470, in do_execute
cursor.execute(statement, parameters)
psycopg2.ProgrammingError: relation "ix_MYTABLENAME_index" already exists
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "ix_MYTABLENAME_index" already exists
[SQL: 'CREATE INDEX "ix_MYTABLENAME_index" ON "MYTABLENAME" (index)']
我成功创建了具有唯一名称的表及其插入,但第二次我收到错误,尽管删除了Dbeaver中的表。
小例子
from datetime import date
from sqlalchemy import create_engine
import numpy as np
import pandas as pd
def storePandasDF2PSQL(myDF_):
#Store results as Pandas Dataframe to PostgreSQL database.
#
#Example
#df=pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
#dbName= date.today().strftime("%Y%m%d")+"_TABLE"
#engine = create_engine('postgresql://hhh:yourPassword@localhost:1234/hhh')
#df.to_sql(dbName, engine)
df = myDF_
dbName = date.today().strftime("%Y%m%d")+"_TABLE"
engine = create_engine('postgresql://hhh:yourPassword@localhost:1234/hhh')
# ERROR: NameError: name 'table' is not defined
#table.declarative_base.metadata.drop_all(engine) #Drop all tables
#TODO: This step is causing errors because the SQLAlchemy thinks the
#TODO: table still exists even though deleted
df.to_sql(dbName, engine)
清理后端的正确方法是什么,例如一些悬挂索引,以便用新数据重新创建表格?换句话说,如何解决错误?
答案 0 :(得分:0)
问题可能来自sqlalchemy方面,它认为有一个索引作为删除表的消息没有通知sqlalchemy。有一种sqlalchemy方法可以删除表格
table.declarative_base.metadata.drop_all(engine)
这应该让Sqlalchemy了解删除情况。
答案 1 :(得分:0)
这个答案没有涉及重用相同的表名,因此也没有解决清理SQLAlchemy元数据的问题。
不要重复使用表名,而是将这样的执行时间添加到tableName的末尾
import time
dbName = date.today().strftime("%Y%m%d")+"_TABLE_"+str(time.time())
dbTableName = dbName
所以你的SQL developmnet环境,比如SQL客户端锁定连接或特定的表,并不重要。使用SQLAlchemy运行Python时,关闭Dbeaver可以提供帮助。