#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()