Форум сайта python.su
0
Приветствую Всех!
Подскажите, пожалуйста, каким способом из скрипта на 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()
Офлайн
568
den1024А подкиньте идей, как такое может быть?
мы не знаем какая БД в данный момент используется
Офлайн
0
Функция которая проводит проверку - работает с курсором. И данной функции дозволено использовать в запросах только стандарт ANSI.
Понятно, что можно передавать тип БД и потом if … elif'ами делать подстановку на проверку ошибок. Но возможно есть более простой (универсальный) вариант?
Офлайн
568
Не понял, в вашей программе уже есть тип БД, иначе как вы создаете коннект к базе и курсор.
Если вы знаете тип БД, что может быть проще чем просто его использовать?
Офлайн
857
den1024Используй шаблон Стратегия. (Посмотришь там пример на питоне.)
если подразумевается, что мы не знаем какая БД в данный момент используется?
Отредактировано py.user.next (Май 27, 2015 00:27:39)
Офлайн
0
Премного благодарен за информацию по шаблону Стратегия.
Еще один вопрос - как можно разобрать обычный 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:
Офлайн
857
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)
Офлайн
72
py.user.nextЕсли PGressHandler реализует некий абстрактный интерфейс DBHandler, то не проще ли в нем сразу бросать обобщенные исключения, наследники DBError - DBNoDbError, DBNoTableError?
Сначала создаёшь общее исключение для СУБД, потом на его основе создаёшь конкретные исключения, потом порождаешь их в соотвествующих ситуациях.
А в стратегии ты их отлавливаешь, и порождаешь общие исключения для всех СУБД.
Офлайн
857
PooHPGressHandler - это конкретный исполнитель.
Если PGressHandler реализует некий абстрактный интерфейс DBHandler
PooHЕсли какое-то не будет отловлено сверху (например, оно есть, но его обработка не нужна), а исполнителей будет множество и каждый со своим набором исключений, то должен быть способ знать, чьё исключение было порождено, чтобы не запутаться.
то не проще ли в нем сразу бросать обобщенные исключения, наследники DBError
Отредактировано py.user.next (Май 28, 2015 07:59:17)
Офлайн
0
py.user.next
Офлайн