2014-01-15 14 views
5

Ich arbeite an der Aktualisierung einiger Python-Code, mit denen ich gearbeitet habe und suchte nach einem Ratschlag für die beste Möglichkeit, mit einer Idee, mit der ich arbeite, umzugehen. Der Teil meines Codes, den ich ändern möchte, ist:Dynamische INSERT-Anweisung in Python

my_reader = csv.reader(input, delimiter = ',',quotechar='|') 
mouse.executemany("INSERT INTO Example_Input (ID,Name,Job,Salary) VALUES (?,?,?,?)", my_reader) 

Der Code funktioniert. Meine Frage ist, kann ich die "(?,?,?,?)" In etwas dynamischer wie 'range()' ändern, um Benutzereingaben zu ermöglichen. Ich verstehe, dass ich auch eine dynamische create table-Anweisung hätte, also könnte eine andere Lösung darin bestehen, die Anzahl der Eingaben zu zählen.

Um ein wenig klarer zu sein: zum Beispiel, wenn ich raw_input ("Wie viele Variablen hat die Tabelle enthalten ?:") und die Eingabe war 2, würde das Programm laufen als ob (?,?).

Gedanken?

(auch ich bin mit SQLite3 und Python 2.7)

Antwort

2

Ihre csv Unter der Annahme eines Header-Feld hatte, konnte man einen DictReader verwenden und die Feldnamen generieren und Parameter seine fieldnames Eigenschaft.

Der Konstruktor für DictReader ermöglicht es Ihnen, die Feldnamen anzugeben, wenn sie nicht in der Datei enthalten sind, sodass Sie den Benutzer bei Bedarf nach diesen Informationen fragen können.

die Header sind in der Datei Angenommen, sollte dieses Beispiel-Code arbeiten:

import csv 
import sqlite3 

#Give the table a name and use it for the file as well 
table_name = 'Example' 
a = open(table_name + '.csv', 'r') 

#Use a dict reader 
my_reader = csv.DictReader(a) 
print my_reader.fieldnames # Use this to create table and get number of field values,etc. 

# create statement 
create_sql = 'CREATE TABLE ' + table_name + '(' + ','.join(my_reader.fieldnames) + ')' 
print create_sql 

#open the db 
conn = sqlite3.connect('example.db') 
c = conn.cursor() 
# Create table using field names 
c.execute(create_sql) 
insert_sql = 'insert into ' + table_name + ' (' + ','.join(my_reader.fieldnames) + ') VALUES (' + ','.join(['?'] * len(my_reader.fieldnames))+ ')' 
print insert_sql 

values = [] 
for row in my_reader: 
    row_values = [] 
    for field in my_reader.fieldnames: 
     row_values.append(row[field]) 
    values.append(row_values) 

c.executemany(insert_sql, values) 
+0

weiß ich, dass einige der cSV-Dateien haben keine Header, die die Variablennamen enthalten ... aber das ist definitiv etwas, das würde ich prüfen und gerechten Staat im 'raw_input()' das th Das Programm wird davon ausgehen, dass das Dokument diese Header enthält. – DataforDays

0

ich eine Funktion vor kurzem schrieb schnell eine Tabelle auf Tabellennamen und eine Liste von Tupeln mit den Zeilendaten basierend aufzufüllen, die ich wollte einfügen. Ich bin mit dem Tupel zu identifizieren, wie viele Spalten zu erwarten sind:

def populate_table(table_name, data): 
    #Grab first tuple and find out how many columns are expected to be edited 
    num_columns = len(data[0]) 
    try: 
     cursor.executemany("INSERT INTO {} VALUES({})".format(table_name, ','.join(['?' for s in xrange(num_columns)]), data) 
     conn.commit() 
    except sqlite3.OperationalError: 
     ... 
1

Auf python3, Listenkomprehensionen und Wörterbücher mit kam ich mit dem folgenden einfachen Code auf, der den Aufbau einer dynamischen SQLite Insert String basierend auf einem gegebenen Lage ist, Wörterbuch:

# Data to be inserted: 

data = [ 
    { 
    'table': 'customers', 
    'values': { 
     'name': '"Doctor Who"', 
     'email': '"[email protected]"' 
    } 
    }, 
    { 
    'table': 'orders', 
    'values': { 
     'customer_id': '1', 
     'item': '"Sonic Screwdriver"', 
     'price': '1000.00' 
    } 
    } 
] 


def generate_insert_query(dictionary): 
    table = dictionary["table"] # Get name of the table 

    # Get all "keys" inside "values" key of dictionary (column names) 
    columns = ', '.join([key for key, value in dictionary["values"].items()]) 

    # Get all "values" inside "values" key of dictionary (insert values) 
    values = ', '.join([value for key, value in dictionary["values"].items()]) 

    # Generate INSERT query 
    print(f"INSERT INTO {table} ({columns}) VALUES ({values})" + "\n") 


# Generate QUERY for each dictionary inside data list 
for query in data: 
    generate_insert_query(query) 

Versuchen Sie den Code auf: https://repl.it/KNZg/2

Verwandte Themen