对于循环使用sqlite始终插入第一个值

时间:2016-12-01 02:34:04

标签: python sqlite

我正在进行投票申请,它允许用户在每个候选人之间键入所有候选人并点击输入以创建与这些候选人的投票。

def newVote(event):
                pos = position.get()
                candidates = addCandEntry.get()
                formatted = [x.strip() for x in candidates.split(',')]
                for x in formatted:
                    c.execute("INSERT INTO current VALUES(?, ?, ?)", (pos,x,0,))
                    c.execute('SELECT * FROM current WHERE position="Chief"')
                    print(c.fetchone())

如果我将以下值传递给位置dad,mom,son,sister,grandma的tkinter条目,它将在sql中输出此输出

('Chief', 'dad', 0)
('Chief', 'dad', 0)
('Chief', 'dad', 0)
('Chief', 'dad', 0)
('Chief', 'dad', 0)

如何让它添加每个值而不仅仅是第一个?

如果您需要,这是完整的代码

import tkinter
from tkinter import *
import sqlite3
import datetime


# testing purposes only
password = 'test'

# create database file
conn = sqlite3.connect('firefight')
c = conn.cursor()

# create tables
c.execute('''CREATE TABLE IF NOT EXISTS users(
          username text, password text, admin boolean)''')
c.execute('''CREATE TABLE IF NOT EXISTS positions(
          position text)''')
c.execute('''CREATE TABLE IF NOT EXISTS current(
          position text, candidate text, votes int)''')
c.execute('''CREATE TABLE IF NOT EXISTS past(
          date DATE, position text, candidate text, votes int, winner boolean)''')

c.execute("INSERT INTO users VALUES('admin', 'VoteProgram', 'yes')")


'''
tables:
users:
    username text
    password text
    admin boolean
positions:
    position text
current:
    position text
    candidate text
    votes int
past:
    position text
    candidate text
    votes int
    winner boolean
'''

# define root window
root = tkinter.Tk()
root.minsize(width=800, height = 600)
root.maxsize(width=800, height = 600)

# Admin sign in Label
areAdmin = Label(root, text="Administrator sign in", font=("Arial", 18))
areAdmin.pack()

# password label and password
passwordLabel = Label(root, text="Password: ", font=("Arial", 12))
passwordLabel.place(x=300, y=30)

# password entry
adminPasswordEntry = Entry(root)
adminPasswordEntry.place(x=385, y=32.5)

# function for button
def getEnteredPassword(event):
    enteredPassword = adminPasswordEntry.get()
    if enteredPassword == password:
        # define admin window
        admin = tkinter.Toplevel()
        admin.minsize(width=800, height = 600)
        admin.maxsize(width=800, height = 600)
        # label saying to change password
        changePasswordLabel = Label(admin, text="It is recommended to change your password the first time you log in.",
                                    font=("Arial", 16), wraplength=500)
        changePasswordLabel.pack()
        # old password
        changePassword_OldPasswordLabel = Label(admin, text="Old Password: ", font=("Arial", 12))
        changePassword_OldPasswordLabel.place(x=250, y=50)
        changePassword_OldPassword = Entry(admin)
        changePassword_OldPassword.place(x=365, y=52.5)
        # new password
        changePassword_NewPasswordLabel = Label(admin, text="New Password: ", font=("Arial", 12))
        changePassword_NewPasswordLabel.place(x=250, y=70)
        changePassword_NewPassword = Entry(admin)
        changePassword_NewPassword.place(x=365, y=72.5)

        # function to change password
        def passwordChangeCommand(event):
            global password
            oldPasswordValue = changePassword_OldPassword.get()
            newPasswordValue = changePassword_NewPassword.get()
            if oldPasswordValue == password:
                password = newPasswordValue
            else:
                wrong = tkinter.Toplevel()
                wrong.minsize(width=200, height = 100)
                wrong.maxsize(width=200, height = 100)
                Label(wrong, text="Sorry that password is incorrect!", font=("Arial", 24), anchor=W, wraplength=180,
                      fg="red").pack()

        # submit button
        newPasswordSubmit = Button(admin, text="Submit", width=10, command=passwordChangeCommand)
        newPasswordSubmit.place(x=350, y=100)

        newVoteLabel = Label(admin, text="Create New Vote", font=("Arial", 16))
        newVoteLabel.place(x=310, y=135)

        # positions drop down
        newVoteChoosePositionLabel = Label(admin, text="Choose the position you are voting for", font=("Arial", 12))
        newVoteChoosePositionLabel.place(x=265, y=170)
        position = StringVar(admin)
        position.set("Chief")
        newVoteOption = OptionMenu(admin, position, "Chief", "First Lieutenant", "Second Lieutenant", "Third Lieutenant",
                                   "Fourth Lieutenant")
        newVoteOption.place(x=355, y=195)

        #add candidates
        addCandLabel = Label(admin, text="Add candidates below, separate each candidate with a comma then press enter when all candidates have been entered"
                             , font=("Arial", 11), wraplength=300, anchor=W)
        addCandLabel.place(x=255, y=235)
        addCandEntry = Entry(admin, width=40)
        addCandEntry.place(x=272, y=295)

        #new vote
        newVoteButton = Button(admin, text="Create Vote", width=15)
        newVoteButton.place(x=335, y=325)

        def newVote(event):
            pos = position.get()
            candidates = addCandEntry.get()
            formatted = [x.strip() for x in candidates.split(',')]
            for x in formatted:
                c.execute("INSERT INTO current VALUES(?, ?, ?)", (pos,x,0,))
                c.execute('SELECT * FROM current WHERE position="Chief"')
                print(c.fetchone())


        addCandEntry.bind("<Return>", newVote)
        newVoteButton.bind("<Button-1>", newVote)

    else:
        wrong = tkinter.Toplevel()
        wrong.minsize(width=200, height=100)
        wrong.maxsize(width=200, height=100)
        Label(wrong, text="Sorry that password is incorrect!", font=("Arial", 24), anchor=W, wraplength=180,
              fg="red").pack()

# enter button for password
passwordEnterButton = Button(root, text="Enter", width=10)
passwordEnterButton.place(x=360, y=60)
passwordEnterButton.bind("<Button-1>", getEnteredPassword)
root.bind("<Return>", getEnteredPassword)

mainloop()

1 个答案:

答案 0 :(得分:2)

因为您使用的是fetchone(),所以您将始终返回第一行('Chief', 'dad', 0)。尽管如此,爸爸,妈妈,儿子,姐妹,奶奶的五个单独记录应该附加到表格中。考虑调整每个插入的位置,然后在单独的循环中输出current的每一行:

for x in formatted:
    c.execute("INSERT INTO current VALUES(?, ?, ?)", (pos,x,0,))

for row in c.execute('SELECT * FROM current WHERE position="Chief"'):
    print(row)

但是,您似乎打算在每次插入后检索最后一行,如果您使用对每条记录自动增量的整数主键id,则可以检索该行:

c.execute('''CREATE TABLE IF NOT EXISTS users(
          id integer primary key, username text, password text, admin boolean)''')
c.execute('''CREATE TABLE IF NOT EXISTS positions(
          id integer primary key, position text)''')
c.execute('''CREATE TABLE IF NOT EXISTS current(
          id integer primary key, position text, candidate text, votes int)''')
c.execute('''CREATE TABLE IF NOT EXISTS past(
          id integer primary key, date DATE, position text, candidate text, 
          votes int, winner boolean)''')

会强制您列出插入列:

c.execute("INSERT INTO users (username, password, admin)" +
          " VALUES('admin', 'VoteProgram', 'yes')")

然后可以使用fetchone()

for x in formatted:
    c.execute("INSERT INTO current (position, candidate, votes) VALUES(?, ?, ?)", (pos,x,0,))
    c.execute('SELECT * FROM current WHERE id = (SELECT Max(sub.id) FROM current sub)')
    print(c.fetchone())