2016-02-02 5 views
0

Я пытаюсь создать базу данных для простой игры, которую я создаю, и имею проблему с запросом на статистику игроков. Пока можно искать и обновлять базу данных, но только путем изменения фактического кода можно изменить условия поиска.Как использовать параметры SQL

Весь код до сих пор (извинения за любые ошибки отступа):

# Importing modules 
import sqlite3 

# Creating database 
base_db = sqlite3.connect("D:\\FILEPATH\\base_db") 

# Creating cursor object 
global cur 
cur = base_db.cursor() 

# Creating players table with username etc. attributes 
cur.execute(""" 
      CREATE TABLE IF NOT EXISTS players 
      (username, password, score) 
      """) 
base_db.commit() 


# Inserts some example data 
def populate_db(): 
    print("Populating database") 
    example_data = [("John Smith", "Password", 10)] 
    cur.executemany(""" 
        INSERT INTO players 
        VALUES (?, ?, ?)""", 
        example_data) 
    base_db.commit() 


# Clears database 
def clear_db(): 
    print("Clearing database") 
    command = (""" 
       DELETE FROM players 
       """) 
    cur.execute(command) 
    base_db.commit() 


# Function that (only) updates the database 
def update_db(mode, name): 
    if mode is "score": 
     print("Updating scores") 
     print("Finding", name) 
     command = (""" 
        UPDATE players 
        SET score = '0' 
        WHERE username = 'John Smith' 
        """) 
     cur.execute(command) 
    base_db.commit() 


# Function that (only) retrieves data from the database 
def retrieve_db(mode, name): 
    # Returns value of player's score 
    if mode is "score": 
     print("Retrieving scores") 
     print("Finding", name) 
     command = (""" 
        SELECT score FROM players 
        WHERE username = 'John Smith' 
        """) 
     return cur.execute(command).fetchone()[0] 

# Returns tuple of username and password 
elif mode is "login": 
    print("Retrieving login details") 
    print("Finding", name) 
    command = (""" 
       SELECT username, password FROM players 
       WHERE username = 'John Smith' 
       """) 
    return cur.execute(command).fetchone()[0:2] 
base_db.commit() 

# Testing results 
populate_db() 

print(retrieve_db("score", "John Smith")) # Expected result is 10 
print(retrieve_db("login", "John Smith")) # Expected result is ('John Smith, 'Password') 

clear_db() 

И раздел Я пытаюсь получить решение:

# Function that (only) retrieves data from the database 
def retrieve_db(mode, name): 
    # Returns value of player's score 
    if mode is "score": 
     print("Retrieving scores") 
     print("Finding", name) 
     command = (""" 
        SELECT score FROM players 
        WHERE username = 'John Smith' 
        """) 
     return cur.execute(command).fetchone()[0] 

Вместо того, где имя пользователя = ' John Smith ', я бы хотел, чтобы вместо этого вместо параметра name в эту команду было принято решение, так что независимо от параметра name этот термин будет искать.

Я нашел аналогичный пример здесь (Searching SQLite Database with Python Variables), но я зациклился на том, как реализовать (?), (Переменную) идею в этот блок кода.

То, что я пытался до сих пор:

command = (""" 
       SELECT score FROM players 
       WHERE username = VALUES (?)""", name) 

    command = (""" 
       SELECT score FROM players 
       WHERE username VALUES (?)""", name) 

Любая помощь вы могли бы дать очень высокую оценку. Заранее спасибо.

Для дальнейшего использования окончательного рабочего варианта я получил:

command = (""" 
       SELECT score FROM players 
       WHERE username = ? 
       """) 
    return cur.execute(command, name).fetchone()[0] 

Если имя было поставлено как [ «John Smith»], когда функция была вызвана.

+1

Вы уже используете параметры в 'populate_db'. В чем проблема? –

+0

В этой функции он просто вставляет значения во все поля без поиска. Моя проблема реализует ту же идею использования (?), (Variable) в команде, где есть также поиск. До сих пор я пробовал несколько разных вариантов. –

+0

Редактировать вопрос, чтобы показать, что вы пробовали. –

ответ

1

VALUES является обязательной частью INSERT statement.

Маркер параметра (?) просто заменяет само значение:

command = (""" 
       SELECT score FROM players 
       WHERE username = ? 
       """) 
    params = ['John Smith'] 
    return cur.execute(command, params).fetchone()[0] 
+0

Еще один вопрос, есть ли все-таки реструктурировать его, поэтому параметр не должен быть списком? –

+0

№ «Джон Смит» будет интерпретироваться как список из десяти символов. –

0
example_data = [("John Smith", "Password", 10)] 
cur.executemany(""" 
       INSERT INTO players 
       VALUES (?, ?, ?)""", 

Рассматривали ли вы отказаться? Слишком мало запятых