Как взаимодействовать с выходным списком из fetchone () в базе данных mysql

#python #mysql #sql #database #mysql-python

#python #mysql #sql #База данных #mysql-python

Вопрос:

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

 def main_menu():
    print("Main Menu")
    print("0 - Quit")
    print("1 - Open Account")
    print("2 - Check Balance")
    print("3 - Close Account")


loop = True
while loop:
    main_menu()
    choice = input("Enter your choice: ")
    choice = int(choice)
    if choice == 0:
        exit(loop)
    elif choice == 1:
        name_on_account = input("Name on account: ")
        balance = float(input("Enter Initial Balance: "))
        print("---Account successfully created---")
        print("Account number:", account_no())
        print("Name on account:", name_on_account)
        print("Balance:", balance)
        print("Account opened on:", now)
        cur.execute("""
        INSERT INTO account(name_on_account, balance) VALUES 
        ("%s", "%s");""", (name_on_account, balance))
        connection.commit()
    elif choice == 2:
        print("Checking account balance")
        account_number = input("Enter account number: ")
        print("---Checking account balance---")
        print("Account number:", account_number)
        cur.execute("""SELECT * from account;
        """)
        account_no1 = cur.fetchone()
        for i in account_no1[0]:
            if account_number == i:
                cur.execute("""select name_on_account from account where account_no = "%s";
                        """, (account_number,))
                name1 = cur.fetchone()
                print(name1)
                name2 = ''.join(map(str,name1))
                name3 = int(name2)
                print("Name on account:", name3)
                cur.execute("""select balance from account where account_no = "%s";
                        """, account_number)
                balance1 = cur.fetchone()
                balance2 = ''.join(map(str,balance1))
                balance3 = int(balance2)
                print("Balance:", balance3)
                cur.expecute("""select account_open_date from account where account no = "%s";
                        """, account_number)
                date1 = cur.fetchone()
                date2 = ''.join(map(str, date1))
                date3 = int(date2)
                print("Account opened on:", date3)
                connection.commit()
            else:
                print("Error: Invalid account number")
  

На данный момент я не беспокоюсь о варианте 3, но у меня возникли проблемы с вариантом 2.

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

Эта информация будет сохранена в таблице учетной записи mysql (account_no, name_on_account, balance, account_open_date, account_status).

Это означает, что account_no автоматически увеличивается, account_open_date по умолчанию используется как curdate(), а account_status по умолчанию является «открытым»).

Однако в варианте 2, когда пользователь вводит номер своей учетной записи; он должен вернуть всю свою информацию, как она отображается в варианте 1.

У меня возникли проблемы с тем, как эффективно перебирать информацию о человеке с помощью fetchone () и получать информацию о конкретном столбце с помощью (account_no = account_number) (если у вас есть лучшее предложение о лучшем способе реализации этого, пожалуйста, прокомментируйте ниже)

Это сообщение об ошибке, которое я получаю: Трассировка (последний последний вызов): файл «(удален в целях конфиденциальности)» для i в account_no1 [0]: TypeError: объект ‘int’ не повторяется

Спасибо за помощь!

Комментарии:

1. Ваше «удалено в целях конфиденциальности» удалило слишком много. Какая строка вызвала ошибку и где эта строка в коде, который вы опубликовали?

Ответ №1:

pymysql (и большинство других клиентов python mysql) возвращает кортеж при вызове fetchone() , и каждая запись в кортеже соответствует типам данных, определенным в таблице, которую вы запрашиваете. Итак, давайте посмотрим на ваш код:

 elif choice == 2:
    print("Checking account balance")
    account_number = input("Enter account number: ")
    print("---Checking account balance---")
    print("Account number:", account_number)
    cur.execute("""SELECT * from account""")
    account_no1 = cur.fetchone()
    for i in account_no1[0]:
  

Здесь вы запрашиваете все столбцы и все строки из account таблицы, считываете первую строку, а затем перебираете все, что находится в первом столбце этой строки. Но это, вероятно, просто столбец id, вероятно, поэтому вы получаете сообщение об ошибке: целые числа не могут быть повторены. Это было бы похоже на написание for i in 10 , Python не понимает, что это значит

Если вы хотите выполнить итерацию по всем возвращаемым строкам, вы можете сделать это следующим образом:

     cur.execute("""SELECT * from account;
    """)
    for row i in cur.fetchall():
        # Each iteration "row" is a tuple of values corresponding to the table's columns
  

Хотя это немного глупо. Вы возвращаете все строки из базы данных, а затем перебираете их и ищете конкретный номер учетной записи. Почему бы просто не сделать это как часть вашего запроса?

     nrows = cur.execute("SELECT * from account where account_no=%s", (account_number,))
    if nrows == 0:
        # Account number not found, do something
    else:
        row = curs.fetchone()
        # row now contains all of the values from the discovered 
  

Обратите внимание, что вам не нужно заключать заполнители в кавычки %s , и вам не нужны точки с запятой. Клиент выполняет все это преобразование за вас.

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

 nrows = cur.execute("SELECT name, balance, date_opened from account where account_no=%s", (account_number,))
if nrows > 0:
    name, balance, date_opened = curs.fetchone()