Python - sqllite upsert en base de datos

 
Vista:
sin imagen de perfil

sqllite upsert en base de datos

Publicado por perro (13 intervenciones) el 05/01/2022 15:42:31
Buenos dias

quiero nesecito insertar una nueva fila de datos en una tabla de sqllite, pero:

* como la interface puede devolver las columnas de la tabla en desorden o incompletas me toco meterle lo de
self.__conn.row_factory = sqlite3.Row para que devuelva los campos como un dict {key: value}

* como algunos de los campos de la base de datos son listas separadas por comas nesecito que la query use los '?'
para que sqllite se encarge de escapar los caracteres raros y no se cargue la sintaxis de la query

*este es el tipo de row que le estoy empujando a la table
1
2
3
4
5
6
7
8
9
10
11
12
values = {
"id": "",
"name": "ddd",
"salary": "200.0",
"department": '["dddd","dddd","dddd","dddd","dddd"]',
"position": "\"aaa\",\"bbb\",\"ccc\",\"ddd\"",
"hireDate": "0001-01-01 12:00"
}
 
users = table_usuarios()
users.set(values)
##users.get_All()

ayer estube peleando todo el dia con el upsert y no fuy capas de hacerlo andar

por un lado porque insert y update tienen formatos diferentes
toca construir una string compleja respetando esos dos formatos y de forma de que inserte correctamente los nombres de las columnas y me deje los espacios con los interrogantes '?' para que sqllite haga su parte saneando los datos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    ########## ########## ########## ########## ########## ##########
    ##
    def set2(self, row):
        cursorObj = self.__conn.cursor()
 
        """
        INSERT INTO phonebook2(name,phonenumber,validDate)
              VALUES('Alice','704-555-1212','2018-05-08')
              ON CONFLICT(name) DO UPDATE SET
                phonenumber=excluded.phonenumber,
                validDate=excluded.validDate
              WHERE excluded.validDate>phonebook2.validDate;
        """
 
        sql = 'INSERT INTO ? ({}) VALUES ({}) '.format( ', '.join(row.keys()), ','.join(['?']*len(row)) )
 
        answers = []
        answers.append(self.__table_name)## 0
        answers.extend(row.values())
 
 
        sql += ' ON CONFLICT(id) DO UPDATE ' ## ?
 
        id = row.pop('id')##quitar el id dela row
 
        sql += ' SET {} WHERE id = ? '.format( ' = ?, '.join(row.keys()) + " = ? "  )
 
        ##answers.append(self.__table_name)## x
        answers.extend(row.values())
        answers.append( id )
 
 
 
        print("########## ########## ########## ########## ")
 
        print(sql)
 
        print(" ")
 
 
 
        print( "answers length = " + str(len(answers)) + ", sql query '?' = " + str(sql.count('?')) )
        print(" ")
        print(answers)
 
 
        print(" ")
 
 
        cursorObj.execute(sql, tuple(answers) )
 
 
        self.__conn.commit()
 
        row['id'] = cursorObj.lastrowid
 
 
        print("########## ########## ########## ########## ")
        print(" ")
 
 
## pasarle datos para probar
values = {
"id": "3",
"name": "ddd",
"salary": "200.0",
"department": '["dddd","dddd","dddd","dddd","dddd"]',
"position": "\"aaa\",\"bbb\",\"ccc\",\"ddd\"",
"hireDate": "0001-01-01 12:00"
}
 
 
##concatenatedString = ', '.join(values.keys())
 
##print( concatenatedString )
 
users = table_usuarios()
users.set2(values)

y tengo de salida


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
usuario@red:~/MEGA/python/sqllite/src/controller$ python3 table_usuarios.py
True
db name => data.db
########## ########## ########## ##########
INSERT INTO ? (id, name, salary, department, position, hireDate) VALUES (?,?,?,?,?,?)  ON CONFLICT(id) DO UPDATE  SET name = ?, salary = ?, department = ?, position = ?, hireDate = ?  WHERE id = ?
 
answers length = 13, sql query '?' = 13
 
['tb_usuarios', '3', 'ddd', '200.0', '["dddd","dddd","dddd","dddd","dddd"]', '"aaa","bbb","ccc","ddd"', '0001-01-01 12:00', 'ddd', '200.0', '["dddd","dddd","dddd","dddd","dddd"]', '"aaa","bbb","ccc","ddd"', '0001-01-01 12:00', '3']
 
Traceback (most recent call last):
  File "/home/usuario/MEGA/python/sqllite/src/controller/table_usuarios.py", line 231, in <module>
    users.set2(values)
  File "/home/usuario/MEGA/python/sqllite/src/controller/table_usuarios.py", line 157, in set2
    cursorObj.execute(sql, tuple(answers) )
sqlite3.OperationalError: near "?": syntax error

sqlite3.OperationalError: near "?": syntax error
el me dice que tengo un error cerca de ?
pero los ? me coinciden con la lista answers y la sql tiene todos los datos donde se suponen que van

alguna idea de que es el error
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder