tania
No puedo encontrar el problema:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegisterForm(request.form)
if request.method=='POST' and form.validate():
name = form.name.data
email = form.email.data
username = form.username.data
password = sha256_crypt.encrypt(str(form.password.data))
c.execute("INSERT INTO users(name,email,username,password)
VALUES(?,?,?,?)", (name, email, username, password))
conn.commit
conn.close()
Error:
Archivo “C:\Users\app.py”, línea 59, en el registro c.execute(“INSERTAR EN usuarios(nombre, correo electrónico, nombre de usuario, contraseña) VALORES (?,?,?,?)”, (nombre, correo electrónico , nombre de usuario, contraseña)) Error de programación: los objetos SQLite creados en un subproceso solo se pueden usar en ese mismo subproceso. El objeto se creó en el subproceso id 23508 y este es el subproceso id 22640
¿Significa esto que no puedo usar el nombre, el nombre de usuario y la contraseña del correo electrónico en un archivo HTML? ¿Cómo puedo solucionar esto?
Cuando realice su conexión a la base de datos, agregue lo siguiente.
conn = sqlite3.connect('your.db', check_same_thread=False)
-
¿Es seguro de usar?
– malvavisco suave
04/04/2018 a las 10:35
-
@uzu, no veo por qué no, siempre que haga su propia sincronización para asegurarse de que solo un subproceso use el objeto al mismo tiempo.
– merlín2011
21 de junio de 2018 a las 3:39
-
Alguna información adicional para futuros lectores de este hilo. Por docs.python.org/3/library/sqlite3.html: De manera predeterminada, check_same_thread es True y solo el hilo de creación puede usar la conexión. Si se establece en False, la conexión devuelta se puede compartir entre varios subprocesos. Cuando se utilizan varios subprocesos con la misma conexión, el usuario debe serializar las operaciones de escritura para evitar la corrupción de datos.
– Snidhi Sofpro
26 de junio de 2018 a las 10:33
-
@ merlin2011, ¿podría ampliar eso? ¿Cuáles son las cosas que no se deben hacer? No estoy seguro de entender completamente
– jokoon
7 de junio de 2020 a las 12:13
-
Siempre que solo un único subproceso esté escribiendo a través de la conexión en un momento dado, es seguro usarlo.
– Ramesh-X
13 de septiembre de 2020 a las 16:46
ndrix
Su cursor ‘c’ no se crea en el mismo hilo; probablemente se inicializó cuando se ejecutó la aplicación Flask.
Probablemente desee generar objetos SQLite (la conexión y el cursor) en el mismo método, como:
@app.route("https://stackoverflow.com/")
def dostuff():
with sql.connect("database.db") as con:
name = "bob"
cur = con.cursor()
cur.execute("INSERT INTO students (name) VALUES (?)",(name))
con.commit()
msg = "Done"
-
Me encontré con esto. Estoy siguiendo un curso de desarrollo de pila completa de udacity que parece tener algunas cosas de python2. Así que en realidad se está convirtiendo en una buena oportunidad de aprendizaje. De cualquier manera funcionó para mí. Tenía lo siguiente en la parte superior del archivo app.py y luego, literalmente, copié y pegué en esa función (ruta) y voilá, problema resuelto.
python DBSession = sessionmaker(bind=engine) session = DBSession()
-Joseph Drane
20 de septiembre de 2018 a las 5:04
-
¿Uno también necesita un
con.close()
o hace elwith
¿cuida de esto?– Clebo
27 de enero de 2019 a las 20:04
JJ
engine = create_engine(
'sqlite:///restaurantmenu.db',
connect_args={'check_same_thread': False}
)
Funciona para mi
-
Hola JJ, ¡bienvenido a Stack Overflow! Por favor, ¿puedes mejorar esta respuesta? Use comillas invertidas simples ` para mostrar un código como este `código` y explique por qué el código en cuestión responde la pregunta/hace el trabajo que la persona pidió.
– usuario230910
18 de febrero de 2019 a las 4:47
Asgar
Puedes probar esto:
engine=create_engine('sqlite:///data.db', echo=True, connect_args={"check_same_thread": False})
funcionó para mí
ng10
En mi caso, tengo el mismo problema con dos archivos python que crean un motor sqlite y, por lo tanto, posiblemente operen en diferentes subprocesos. Leyendo el documento de SQLAlchemy aquíparece que es mejor usar la técnica singleton en ambos archivos:
# maintain the same connection per thread
from sqlalchemy.pool import SingletonThreadPool
engine = create_engine('sqlite:///mydb.db',
poolclass=SingletonThreadPool)
No resuelve todos los casos, lo que significa que ocasionalmente obtengo el mismo error, pero puedo solucionarlo fácilmente, actualizando la página del navegador. Como solo estoy usando esto para depurar mi código, está bien para mí. Para una solución más permanente, probablemente debería elegir otra base de datos, como PostgreSQL u otra base de datos
azametzin
Tuve el mismo problema y lo solucioné cerrando mi conexión después de cada llamada:
results = session.query(something, something).all()
session.close()
Como se menciona en https://docs.python.org/3/library/sqlite3.html y señalado por @Snidhi Sofpro en un comentario
De forma predeterminada, check_same_thread es True y solo el hilo de creación puede usar la conexión. Si se establece en False, la conexión devuelta se puede compartir entre varios subprocesos. Cuando se utilizan varios subprocesos con la misma conexión, el usuario debe serializar las operaciones de escritura para evitar la corrupción de datos.
Una forma de lograr la serialización:
import threading
import sqlite3
import queue
import traceback
import time
import random
work_queue = queue.Queue()
def sqlite_worker():
con = sqlite3.connect(':memory:', check_same_thread=False)
cur = con.cursor()
cur.execute('''
CREATE TABLE IF NOT EXISTS test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT,
source INTEGER,
seq INTEGER
)
''')
while True:
try:
(sql, params), result_queue = work_queue.get()
res = cur.execute(sql, params)
con.commit()
result_queue.put(res)
except Exception as e:
traceback.print_exc()
threading.Thread(target=sqlite_worker, daemon=True).start()
def execute_in_worker(sql, params):
# you might not really need the results if you only use this
# for writing unless you use something like https://www.sqlite.org/lang_returning.html
result_queue = queue.Queue()
work_queue.put(((sql, params), result_queue))
return result_queue.get(timeout=5)
def insert_test_data(seq):
time.sleep(random.randint(0, 100) / 100)
execute_in_worker(
'INSERT INTO test (text, source, seq) VALUES (?, ?, ?)',
['foo', threading.get_ident(), seq]
)
threads = []
for i in range(10):
thread = threading.Thread(target=insert_test_data, args=(i,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
for res in execute_in_worker('SELECT * FROM test', []):
print(res)
# (1, 'foo', 139949462500928, 9)
# (2, 'foo', 139949496071744, 5)
# (3, 'foo', 139949479286336, 7)
# (4, 'foo', 139949487679040, 6)
# (5, 'foo', 139949854099008, 3)
# (6, 'foo', 139949470893632, 8)
# (7, 'foo', 139949862491712, 2)
# (8, 'foo', 139949845706304, 4)
# (9, 'foo', 139949879277120, 0)
# (10, 'foo', 139949870884416, 1)
Como puede ver, los datos se insertan desordenados, pero todavía se manejan uno por uno en un while
círculo.
No, son claramente objetos de Python definidos justo encima. El mensaje de error habla de la conexión y el cursor.
– ndrix
12 de enero de 2018 a las 1:18