Python SQLAlchemy: psycopg2.ProgrammingError отношение уже существует? - PullRequest
0 голосов
/ 30 апреля 2018

Я повторил попытку создания таблицы MYTABLENAME с помощью SQLAlchemy в Python. Я удалил все таблицы через мой 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)

Как правильно очистить серверную часть, такую ​​как некоторый индекс зависания, чтобы воссоздать таблицу со свежими данными? Другими словами, как решить ошибку?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Этот ответ не касается повторного использования тех же имен таблиц и, следовательно, не касается очистки метаданных SQLAlchemy.

Вместо повторного использования имен таблиц добавьте время выполнения, подобное этому, в конец tableName

import time 
dbName  = date.today().strftime("%Y%m%d")+"_TABLE_"+str(time.time())
dbTableName = dbName

так что ваша среда разработки SQL, такая как клиент SQL, блокирующий соединение или определенные таблицы, не имеет большого значения. Закрытие Dbeaver может помочь при запуске Python с SQLAlchemy.

0 голосов
/ 30 апреля 2018

Возможно, проблема связана со стороной sqlalchemy, которая считает, что существует индекс, поскольку сообщение об удалении таблиц не было отправлено в sqlalchemy. Существует sqlalchemy способ удаления таблиц

table.declarative_base.metadata.drop_all(engine)

Это должно информировать Sqlalchemy об удалениях.

...