2010-08-29 18 views
5

Estoy tratando de seleccionar todos los registros de un sqlite db que tengo con sqlalchemy, ciclo sobre cada uno y hacer una actualización sobre él. Estoy haciendo esto porque necesito volver a formatear alguna vez grabar en mi columna de nombre.tabla de base de datos sqlalchemy está bloqueada

Aquí está el código que estoy utilizando para hacer una prueba sencilla:

def loadDb(name):  

     sqlite3.connect(name)  
     engine = create_engine('sqlite:///'+dbPath(), echo=False)  
     metadata = MetaData(bind=engine) 

     return metadata 

    db = database("dealers.db") 
    metadata = db.loadDb() 
    dealers = Table('dealers', metadata, autoload=True) 

    dealer = dealers.select().order_by(asc(dealers.c.id)).execute() 

    for d in dealer: 
     u = dealers.update(dealers.c.id==d.id) 
     u.execute(name="hi") 

     break 

estoy recibiendo el error:

sqlalchemy.exc.OperationalError: (OperationalError) database table is locked u'UPDATE dealers SET name=? WHERE dealers.id = ?' ('hi', 1) 

que soy muy nuevo en sqlalchemy y no estoy seguro de lo que significa este error o cómo solucionarlo Parece que debería ser una tarea realmente simple, así que sé que estoy haciendo algo mal.

Respuesta

4

Con SQLite, no puede actualizar la base de datos mientras aún realiza la selección. Debe forzar la consulta de selección para finalizar y almacenar todos los datos, luego realice su ciclo. Creo que esto sería hacer el trabajo (no probado):

dealer = list(dealers.select().order_by(asc(dealers.c.id)).execute()) 

Otra opción sería hacer una declaración SQL ligeramente más complicado para que el bucle se ejecuta dentro de la base de datos en lugar de en Python. Eso sin duda le dará un gran impulso de rendimiento.

+0

La opción uno no funcionará ... ¿algún consejo más con la opción dos? Básicamente, estoy tratando de eliminar todos los caracteres no ascii de una de las columnas de mi DB. – imns

+0

Asunto: "la opción uno no funcionará" ¿No puede hacer una lista desde los objetos de la base de datos seleccionados? Por qué no? – hughdbrown

+0

Así que sé que esto es muy tarde para la fiesta, pero si las personas en el futuro se topan con esto, me parece que al cerrar todas las consolas abiertas que están accediendo a la base de datos borra este problema. – ExperimentsWithCode

Cuestiones relacionadas