2 votes

Sqlite n'utilise pas les valeurs par défaut

Lors de l'utilisation :

import datetime
import sqlite3

db = sqlite3.connect('mydb.sqlite', detect_types=sqlite3.PARSE_DECLTYPES)
c = db.cursor()
db.text_factory = str

c.execute('create table if not exists mytable (date timestamp, title str, \
    custom str, x float, y float, z char default null, \
    postdate timestamp default null, id integer primary key autoincrement, \
    url text default null)')
c.execute('insert into mytable values(?, ?, ?, ?, ?)', \
    (datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))

Je l'ai fait :

sqlite3.OperationalError : la table mytable a 9 colonnes mais 5 valeurs ont été fournies

Pourquoi SQlite ne prend-il pas en considération les valeurs par défaut (spécifiées lors de la création de la table) pour remplir une nouvelle ligne ?

(Par ailleurs, comme je rouvre un projet que j'ai écrit il y a quelques années, je ne trouve pas les datatypes str , char plus dans la doc sqlite3, est-ce toujours d'actualité ?)

3voto

MikeT Points 12446

Parce que vous dites que vous voulez insérer toutes les colonnes sans spécifier les colonnes spécifiques.

Changer 'insert into mytable values(?, ?, ?, ?, ?)'

à 'insert into mytable (date, title, custom, x, y) values(?, ?, ?, ?, ?)'

Pratiquement n'importe quelle valeur peut être spécifiée pour le type de colonne, la valeur suivra un ensemble de règles et sera convertie en TEXTE, INTEGER, REAL, NUMERIC ou BLOB. Cependant, vous pouvez stocker n'importe quel type de valeur dans n'importe quelle colonne.

  • STR sera résolu en NUMERIC,
  • TIMESTAMP sera résolu en NUMERIC,
  • FLOAT se résoudra en REAL,
  • CHAR à TEXT.

Lisez le document suivant Types de données dans SQLite ou peut-être jeter un coup d'œil sur Quelle est la flexibilité/restriction des types de colonnes SQLite ?

2voto

mypetlion Points 1834

Si vous ne fournissez des valeurs que pour certaines colonnes, vous devez préciser lesquelles. Sinon, le moteur ne saura pas où les placer. Cette ligne doit être modifiée :

c.execute('insert into mytable values(?, ?, ?, ?, ?)', \
(datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))

A cela :

c.execute('insert into mytable (date, title, custom, x, y)values(?, ?, ?, ?, ?)', \
(datetime.datetime(2018,4,23,23,00), 'Test', 'Test2', 2.1, 11.1))

0voto

Mujeeb I. Points 11

Exemple de solution

cursor.execute('CREATE TABLE vehicles_record (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)')

Requête SQLite3 ci-dessus

cursor.execute("INSERT INTO vehicles_record(name) VALUES(?)", (name))

Résultat

id serait 1, name serait la valeur de name var, l'horodatage actuel de la dernière colonne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X