Запрет записи пустых записей в базу данных - это SQL3 & Python - PullRequest
0 голосов
/ 09 апреля 2020

Это первый раз, когда я публикую сообщения, поэтому надеюсь, что я делаю это правильно.

Может кто-нибудь помочь мне с проблемой, которую я, кажется, не могу решить. У меня был хороший Google, но не нашел ответа. Я использую Python 3.7 и SQL3

Я пытаюсь предотвратить запись записи в базу данных, если поле 'f_name' пустое.

Я попытался поставить условие на conn.commit () из-за отсутствия записи - не сработало. Я попытался выполнить условие и сделать отступ c .execute, если f-name пустое, но это не сработало, так как, я думаю, оно еще не получило ввода.

если я распечатываю f_name после c .execute, я получаю «.! Entry2» независимо от того, есть ли вход или нет, если это имеет какое-то значение или дает подсказку. Я предполагаю, что он записывается непосредственно в базу данных и не существует как переменная.

Проверка ошибок, которую я использую, заключается в следующем (я успешно использовал ее в другом месте, поэтому все должно быть в порядке)

if f_name =="":
          print("No valid Data in First name field")
          return
else:
          conn.commit()

и я попытался использовать проверку ошибок на conn.commit (), но я предполагаю, что это автоматическая фиксация.

Может кто-нибудь дать мне представление о том, как предотвратить прием пустого f_name в этом сценарии?

Вот вызываемый код -

def submit():
    # Connect to database
    conn = sqlite3.connect('address_book.db')
    c = conn.cursor()

    six_month_reminder = ("f")
    annual_reminder = ("f")
    six_month_reminder_sent = ("f")
    annual_reminder_sent = ("f")

    # Insert Into Table
    c.execute("INSERT INTO addresses VALUES (:f_name, :l_name, :address, :city, :state, :zipcode, :six_month_reminder, :annual_reminder, :six_month_reminder_sent, :annual_reminder_sent)",
            {
                'f_name': f_name.get(),
                'l_name': l_name.get(),
                'address': address.get(),
                'city': city.get(),
                'state': state.get(),
                'zipcode': zipcode.get(),
                'six_month_reminder': six_month_reminder,
                'annual_reminder': annual_reminder,
                'six_month_reminder_sent': six_month_reminder_sent,
                'annual_reminder_sent':annual_reminder_sent
            })

    conn.commit()
    conn.close()

1 Ответ

0 голосов
/ 09 апреля 2020

спасибо за участие в SO.

В вашем фрагменте кода отсутствует часть, в которой вы объявляете f_name, l_name, address ...

Предполагая, что вы объявив их в блоке, который вы не написали в вопросе, я предполагаю, что fname установлено, и это словарь; самый простой способ - это проверить при выполнении get():

    ...
    annual_reminder_sent = ("f")

    if f_name.get() == '' or f_name.get() is None:
        return
    ...

РЕДАКТИРОВАТЬ: второй оператор для or необходим, так как в случае, если ключ отсутствует в словаре, get вернет None, см. Python документацию о .

В случае, если вы пропустили это, использование get() предполагается для словарей. Например, если вы попробуете это в Python REPL:

>> d = {
   "key1": 1,
   "key2": 2
}
>> print(d.get("key1"))

вернет 1. Словари являются картами ключ-значение.

В вашем случае кажется, что вы делаете что-то не так, когда используете get() для имен, которые не являются словарями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...