Я пишу функцию, которая может добавить новую таблицу в мою базу данных. У меня проблема, когда таблица уже существует, я получаю сообщение об ошибке:

pymysql.err.InternalError: (1050, "Table 'doesthiswork' already exists")

Поэтому я добавил исключение в мой код, который работает, но он исключает все внутренние ошибки. Как мне получить мой код, кроме конкретной ошибки, которая, как я предполагаю, 1050, а не внутренних ошибок в целом?

import pymysql

def CreateTable(Host,User,Password,DataBase,TableName):

    try:
        conn = pymysql.connect(
                           host = Host,
                           user = User,
                           password= Password,
                           db = DataBase
                          )
        a = conn.cursor()
        tblName = TableName
        sql = 'CREATE TABLE'+" "+ tblName + '(try varchar(128));'

        a.execute(sql)

    except pymysql.err.InternalError: 
        print (tblName + " " + 'already exist')

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

5
ZacAttack 9 Янв 2017 в 01:36

3 ответа

Лучший ответ

Присвойте исключение переменной и проверьте конкретные коды ошибок, например:

except pymysql.err.InternalError as e:
    code, msg = e.args
    if code == 1050:
        print(tblName, 'already exists')

Хотя вы можете просто print(msg).

6
AChampion 8 Янв 2017 в 22:45

Вам не нужно жестко кодировать значения кода, они доступны в pymysql.constants.ER модуль. И у вас может быть отображение между кодами ошибок и сообщениями об ошибках, которые могут помочь масштабировать этот подход для обработки большего количества ошибок без умножения блоков if / else:

from pymysql.constants import ER

error_codes = {
   ER.TABLE_EXISTS_ERROR: "Table already exists",
   ER.ACCESS_DENIED_ERROR: "Access denied"
}

try:
    # ...
except pymysql.err.InternalError as e:
    code, msg = e.args
    print(error_codes.get(code, msg))
3
alecxe 8 Янв 2017 в 22:50

Вы можете добавить дополнительный «все», кроме как:

try:
    # your code here
except pymysql.err.InternalError:
    print('already exists')
except:
    print('catch-all exception!')
0
Glenn 8 Янв 2017 в 22:43