sqlite3.EperationalError: no existe tal columna:

Esta es una pregunta muy básica y sé que hay problemas de seguridad con este código y debería estar usando entradas parametrizadas entre otras cuestiones, es un trabajo en progreso. Estoy intentando configurar un módulo de registro de usuario para un proyecto. He configurado una tabla con la primera columna como ID con una restricción de clave principal, pero cuando ejecuto el código, aparece el siguiente error y no estoy seguro de por qué (si está relacionado con la columna p_ID):

Traceback (most recent call last): File "user.py", line 72, in  userSignUp() File "user.py", line 68, in userSignUp c.execute("INSERT INTO People VALUES(userName, password, confirmPassword, firstName,lastName, companyName, email, phoneNumber,addressLine1, addressLine2, addressLine3, zipCode, province, country, regDate)") sqlite3.OperationalError: no such column: userName 

El código es:

 import sqlite3 import datetime path = "/Users/workhorse/thinkful/" db = "apartment.db" def checkAndCreateDB(): #not checking for some reason #fullPath = os.path.join(path, db) #if os.path.exists(fullPath): # print "Database Exists" #else: connection = sqlite3.connect(db) print "Creating database" createUserRegTable() def createUserRegTable(): with sqlite3.connect(db) as connection: c = connection.cursor() c.execute("""CREATE TABLE People (p_ID INTEGER PRIMARY KEY AUTOINCREMENT, userName TEXT NOT NULL UNIQUE, password TEXT NOT NULL, confirmPassword TEXT NOT NULL, firstName TEXT NOT NULL, lastName TEXT NOT NULL, companyName TEXT NOT NULL, email TEXT NOT NULL UNIQUE, phoneNumber TEXT NOT NULL, addressLine1 TEXT NOT NULL, addressLine2 TEXT, addressLine3 TEXT, zipCode TEXT NOT NULL, province TEXT NOT NULL, country TEXT NOT NULL, regDate DATE NOT NULL) """) print "table made" def userSignIn(): pass def userSignUp(): userName = raw_input("Enter a user name: ") password = raw_input("Enter a password: ") confirmPassword = raw_input("Confirm Your Password: ") firstName = raw_input("Enter your first name: ") lastName = raw_input("Enter your last name: ") companyName = raw_input("Enter your company name: ") email = raw_input("Enter your email: ") phoneNumber = raw_input("Enter your phone number: ") addressLine1 = raw_input("Enter your address: ") addressLine2 = raw_input("Enter second line of your address (Not Required): ") addressLine3 = raw_input("Enter third line of your address (Not Required): ") zipCode = raw_input("Enter your zip code: ") province = raw_input("Enter your state or province: ") country = raw_input("Enter your country: ") regDate = datetime.date.today() print regDate #userInfo = (userName, password, confirmPassword, firstName,lastName, companyName, email, phoneNumber,addressLine1, #addressLine2, addressLine3, zipCode, province, country, regDate) with sqlite3.connect(db) as connection: c = connection.cursor() c.execute("INSERT INTO People VALUES(userName, password, confirmPassword, firstName,lastName, companyName, email, phoneNumber,addressLine1, addressLine2, addressLine3, zipCode, province, country, regDate)") checkAndCreateDB() userSignUp() 

Muchas gracias

Si desea insertar valores de Python en una base de datos SQL, no basta con nombrar las variables de Python en la statement SQL. En su lugar, la base de datos SQL cree que desea insertar valores tomados de la tabla o de otra consulta.

Utilice parámetros SQL en su lugar, y pase los valores reales:

 params = (userName, password, confirmPassword, firstName, lastName, companyName, email, phoneNumber, addressLine1, addressLine2, addressLine3, zipCode, province, country, regDate) c.execute("INSERT INTO People VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", params) 

El valor NULL es para la columna de clave primaria p_ID ; la alternativa es nombrar todas las columnas para las que desea insertar valores.

La respuesta de Martijn es excelente, pero funciona si sabes que cierto valor será NULL. Pero si alguna variable podría ser NULL, usé una implementación ligeramente diferente.

Establezca cualquier variable en Ninguna. Si explora su base de datos, el valor será nulo y se mostrará como Ninguno en su consola de Python ya que son equivalentes.

Consulte la sección 11.13.5.1 en la documentación ( https://docs.python.org/2/library/sqlite3.html ):

Tipo de Python Ninguno = Tipo de SQLite NULL

Como no tenía ningún dato importante en db.sqlite3 .

Arreglé mi problema eliminando db.sqlite3 y ejecutando el siguiente comando.

 python manage.py migrate