2014-01-15 2 views
5

Я работаю над обновлением некоторого кода Python, с которым я работал, и искал некоторые советы по лучшему способу справиться с идеей, с которой я работаю. Часть моего кода, которую я хочу изменить:Dynamic INSERT Statement в Python

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

Код работает. Мой вопрос: могу ли я изменить «(?,?,?,?)» На нечто более динамичное, например «range()», чтобы разрешить ввод данных пользователем. Я понимаю, что мне также придется иметь динамический оператор create table, поэтому другим решением может быть подсчет количества входов.

Чтобы быть немного более понятным: например, если у меня есть raw_input («Сколько переменных содержит таблица?»), А для ввода было 2, программа могла бы работать как будто (?,?).

Мысли?

(также я использую SQLite3 и Python 2.7)

ответ

2

Если предположить, что CSV-файл имел поле заголовка, вы можете использовать DictReader и генерировать имена полей и параметров его свойство fieldnames.

Конструктор для DictReader позволяет указать имена полей, если они не указаны в файле, поэтому вы можете запросить у пользователя эту информацию, если потребуется.

Если предположить, что заголовки в файле, этот пример код должен работать:

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

Я знаю, что некоторые из CSV-файлов не имеют заголовков, содержащие имена переменных ... однако это определенно то, что я хотел бы рассмотреть и справедливое государство в 'raw_input()', который e, предполагается, что документ содержит эти заголовки. – DataforDays

0

Недавно я написал функцию для быстрого заполнения таблицы на основе имени таблицы и список кортежей с данными строки, которые я хотел вставить. Я использую кортеж, чтобы определить, сколько столбцов ожидается:

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

На Python3, используя списочные и словари я придумал следующий простой код, который способен построить динамическую строку SQLite вставки, основываясь на заданном словарь:

# 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) 

Попробуйте код на: https://repl.it/KNZg/2