Могу ли я выбрать только один указанный элемент c в запросе sql (оператор select)? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь создать инструмент командной строки, который генерирует случайную строку (пароль) заданной длины, сохраняет ее в sql дБ и может запрашиваться по имени. Генерация пароля и сохранение его вывода по заданному имени прекрасно работает, но попытка выбрать только элемент пароля доставляет мне проблемы. Я был в состоянии выбрать все из таблицы, но это возвращает имя и пароль. Я только хочу вернуть пароль. Я думал о том, чтобы просто объединить вывод или даже использовать команду linux cut, но я бы предпочел просто получить его из оператора select. Это возможно? Мой текущий SELECT оператор возвращает: operation parameter must be a str. Когда я пытаюсь сделать это без вызова (name) в конце оператора SELECT следующим образом: query_password = """SELECT * FROM password_table WHERE name = ?""" я получаю эту ошибку:

  File "passbox.py", line 44, in <module>
    query_pswd_by_name(name)
  File "passbox.py", line 39, in query_pswd_by_name
    c.execute(query_password)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 0 supplied.

Кстати, я уверен, что моя query_pswd_by_name функция все неправильно, я экспериментировал. Когда я просто создаю соединение и оператор SELECT вне функции, возвращает имя и пароль.

Также обратите внимание, что для этой статьи я замаскировал имя файла базы данных звездочками. Я на практике использую действующий файл БД.

Вот весь код, который я написал до сих пор:

import secrets 
import string
import sqlite3


#CREATE PASSWORD OF GIVEN LENGTH
def get_pass(length):
        return "".join(secrets.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits + string.punctuation) for x in range(length))

length = int(input("Enter the length of password: "))
password= get_pass(length)
print(password)


name = str(input("Enter name for password: "))

#CREATE DATABASE CONNECTION
conn = sqlite3.connect("****.db")

#CREATE CURSOR OBJECT
c = conn.cursor()

#CREATE TABLE IN DISK FILE BASED DATABASE
c.execute("""CREATE TABLE IF NOT EXISTS password_table (
                        name TEXT,
                        pswd TEXT
                        )""")
c.execute("INSERT INTO password_table (name, pswd) VALUES (?, ?)", (name, password))

#COMMIT CHANGES
conn.commit()
conn.close()

def query_pswd_by_name(name):
    conn = sqlite3.connect('****.db')
    c = conn.cursor()
    query_password = """SELECT * FROM password_table WHERE name = ?""", (name)
    c.execute(query_password)
    result = c.fetchall()
    for row in result:
        print(row[1])
    conn.commit()
query_pswd_by_name(name)



#CLOSE CONNECTION
conn.close()```


1 Ответ

0 голосов
/ 13 февраля 2020

Вам нужно разбить аргумент для вызова execute.

c.execute(*query_password)

Или

c.execute("""SELECT * FROM password_table WHERE name = ?""", (name))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...