Форум сайта python.su
Приветствую Всех!
Подскажите, пожалуйста, каким способом из скрипта на python 3.4 можно проверить существование таблицы в БД если подразумевается, что мы не знаем какая БД в данный момент используется?
Ранее для postgres я проверял отработку по номеру Exception:
try: # Выполняем запрос на выборку из таблицы (SELECT) curs.execute(query) self.conn.commit() except psycopg2.Error as e: self.conn.rollback() if e.pgcode == '42P01': # Если получаем данную ошибку - таблица не существует return 'notTable', 'OK' else: error_message = "Error while searching table in the database in function is_object_table: " + e.pgerror return 'False', error_message finally: curs.close()
Офлайн
den1024А подкиньте идей, как такое может быть?
мы не знаем какая БД в данный момент используется
Офлайн
Функция которая проводит проверку - работает с курсором. И данной функции дозволено использовать в запросах только стандарт ANSI.
Понятно, что можно передавать тип БД и потом if … elif'ами делать подстановку на проверку ошибок. Но возможно есть более простой (универсальный) вариант?
Офлайн
Не понял, в вашей программе уже есть тип БД, иначе как вы создаете коннект к базе и курсор.
Если вы знаете тип БД, что может быть проще чем просто его использовать?
Офлайн
den1024Используй шаблон Стратегия. (Посмотришь там пример на питоне.)
если подразумевается, что мы не знаем какая БД в данный момент используется?
Отредактировано py.user.next (Май 27, 2015 00:27:39)
Офлайн
Премного благодарен за информацию по шаблону Стратегия.
Еще один вопрос - как можно разобрать обычный Exception при использовании разных БД?
Когда я работаю с postgres, код обработки исключения (который я использую для определения существует ли таблица или нет) выглядит так:
except psycopg2.Error as e: self.conn.rollback() if e.pgcode == '42P01': # Если получаем данную ошибку - таблица не существует return 'notTable', 'OK' else: error_message = "Error while searching table in the database in function is_object_table: " + e.pgerror return 'False', error_message finally: curs.close()
except Exception as e:
Офлайн
den1024Не нужно ловить Exception, оно используется для создания производных исключений.
Еще один вопрос - как можно разобрать обычный Exception при использовании разных БД?
den1024Это ерунда.
Когда я работаю с postgres, код обработки исключения (который я использую для определения существует ли таблица или нет) выглядит так:
class PGressError(Exception): pass class PGressNoDbError(PGressError): pass class PGressNoTableError(PGressError): pass class PGressHandler: def connect(self, host, port, user, password): pass def select_db(self, name): if not self.has_db(name): raise PGressNoDbError('no such database') def has_db(self, name): return False def create_table(self, name): pass def disconnect(self): pass pgress = PGressHandler() pgress.connect('h', 'p', 'u', 'p') pgress.select_db('x') pgress.disconnect()
Отредактировано py.user.next (Май 27, 2015 19:16:00)
Офлайн
py.user.nextЕсли PGressHandler реализует некий абстрактный интерфейс DBHandler, то не проще ли в нем сразу бросать обобщенные исключения, наследники DBError - DBNoDbError, DBNoTableError?
Сначала создаёшь общее исключение для СУБД, потом на его основе создаёшь конкретные исключения, потом порождаешь их в соотвествующих ситуациях.
А в стратегии ты их отлавливаешь, и порождаешь общие исключения для всех СУБД.
Офлайн
PooHPGressHandler - это конкретный исполнитель.
Если PGressHandler реализует некий абстрактный интерфейс DBHandler
PooHЕсли какое-то не будет отловлено сверху (например, оно есть, но его обработка не нужна), а исполнителей будет множество и каждый со своим набором исключений, то должен быть способ знать, чьё исключение было порождено, чтобы не запутаться.
то не проще ли в нем сразу бросать обобщенные исключения, наследники DBError
Отредактировано py.user.next (Май 28, 2015 07:59:17)
Офлайн
py.user.next
Офлайн