2010-04-22 3 views
1

Disons que j'ai un tableau simple de x lignes et y colonnes avec des valeurs correspondantes, Quelle est la meilleure méthode pour faire 3 choses? Comment insérer, mettre à jour une valeur dans une colonne de ligne spécifique? Comment sélectionner une valeur pour chaque ligne et colonne,Comment insérer et appeler par ligne et par colonne dans sqlite3 python

import sqlite3 
con = sqlite3.connect('simple.db') 
c = con.cursor() 
c.execute('''create table simple (links text)''') 
con.commit() 

dic = {'x1':{'y1':1.0,'y2':0.0},'x2':{'y1':0.0,'y2':2.0,'y3':1.5},'x3':{'y2':2.0,'y3':1.5}} 
ucols = {} 
## my current thoughts are collect all row values and all column values from dic and populate table row and columns accordingly how to call by row and column i havn't figured out yet 
##populate rows in first column 
for row in dic: 
    print row 
    c.execute("""insert into simple ('links') values ('%s')"""%row) 
con.commit() 

##unique columns 
for row in dic: 
    print row 
    for col in dic[row]: 
     print col 
     ucols[col]=dic[row][col] 

##populate columns  
for col in ucols: 
    print col 
    c.execute("alter table simple add column '%s' 'float'" % col) 
con.commit() 

#functions needed 
##insert values into sql by row x and column y?how to do this e.g. x1 and y2 should put in 0.0 
##I tried as follows didn't work 
for row in dic: 
    for col in dic[row]: 
     val =dic[row][col] 
     c.execute("""update simple SET '%s' = '%f' WHERE 'links'='%s'"""%(col,val,row)) 
con.commit() 

##update value at a specific row x and column y? 


## select a value at a specific row x and column y? 
+0

Je suis surpris cela n'a pas été downvoted pour ajouter "grand problème tutoriel" à la question. – mikerobi

+0

Salut je suis nouveau ici je vais corriger :) – user291071

Répondre

2

Vous avez donc un dictionnaire de dictionnaires, que vous voulez convertir en une table SQL.

Steps je prendrais

  1. Trouver les colonnes dont vous aurez besoin.
  2. Créez le schéma de la table.
  3. Parcourez chaque rangée.
    1. Compilez l'ensemble des valeurs pour chaque colonne.
    2. Insérez-le.

Alors:

import sqlite3 
con = sqlite3.connect('simple.db') 
c = con.cursor() 

dic = { 
    'x1':{'y1':1.0,'y2':0.0}, 
    'x2':{'y1':0.0,'y2':2.0,'y3':1.5}, 
    'x3':{'y2':2.0,'y3':1.5} 
    } 

# 1. Find the unique column names. 
columns = set() 
for cols in dic.values(): 
    for key in cols: 
     columns.add(key) 

# 2. Create the schema. 
col_defs = [ 
    # Start with the column for our key name 
    '"row_name" VARCHAR(2) NOT NULL PRIMARY KEY' 
    ] 
for column in columns: 
    col_defs.append('"%s" REAL NULL' % column) 
schema = "CREATE TABLE simple (%s);" % ",".join(col_defs) 
c.execute(schema) 

# 3. Loop through each row 
for row_name, cols in dic.items(): 

    # Compile the data we have for this row. 
    col_names = cols.keys() 
    col_values = [str(val) for val in cols.values()] 

    # Insert it. 
    sql = 'INSERT INTO simple ("row_name", "%s") VALUES ("%s", "%s");' % (
     '","'.join(col_names), 
     row_name, 
     '","'.join(col_values) 
     ) 
    c.execute(sql) 

Ensuite, vos questions sont assez simples:

## update value at a specific row x and column y? 
def set_cell(connection, x_name, y_name, value): 
    sql = 'UPDATE simple SET %s="%s" WHERE row_name="%s"' % (
     y_name, value, x_name 
     ) 
    connection.execute(sql) 

## select a value at a specific row x and column y? 
def get_cell(connection, x_name, y_name): 
    sql = 'SELECT %s FROM simple WHERE row_name="%s"' % (
     y_name, x_name 
     ) 
    # Return the first row of results (there should be only one) 
    # and the first column from that row 
    return list(connection.execute(sql))[0][0] 
+0

merci beaucoup pour votre réponse détaillée, agréable de voir le bon code! – user291071

+0

Cool, merci. Si cela vous était utile, accepteriez-vous ma réponse? – Ian

+0

Oh ya pas vu ça, j'ai essayé d'upvoter mais je n'ai pas encore de rep pour ça, lol, une autre question avec laquelle je suis aux prises, devrais-je mettre cela comme une autre réponse? Si je change les valeurs de colonne dans le dict pour dire 'y3' à 'une chaîne aléatoire' je ne peux pas obtenir le code pour fonctionner. J'ai essayé de changer plusieurs choses au lieu d'utiliser le vrai, j'ai utilisé du texte, mais quand j'appelle ça dit que la colonne n'existe pas de pensées? – user291071