2013-05-27 2 views
2

Я добавлял свой ответ, который работает но открыты для УЛУЧШЕНИЯMySQL не принимает executemany() INSERT, работает Python из Excel (datanitro)

После просмотра проекта в datanitro. Я взял на себя подключение к MySQL (они используют SQLite), и я смог импортировать небольшую тестовую таблицу в Excel из MySQL.

Вставка новых обновленных данных из листа Excel была эта следующая задача, и до сих пор я могу получить один ряд, чтобы работать, как так ...

import MySQLdb 

db = MySQLdb.connect("xxx","xxx","xxx","xxx") 
c = db.cursor() 

c.execute("""INSERT INTO users (id, username, password, userid, fname, lname) 
VALUES (%s, %s, %s, %s, %s, %s);""", 
     (Cell(5,1).value,Cell(5,2).value,Cell(5,3).value,Cell(5,4).value,Cell(5,5).value,Cell(5,6).value,)) 

db.commit() 
db.close() 

... но попытки несколько строк не получится. Я подозреваю, что у вас есть проблемы при перемещении строк в Excel. Вот то, что я до сих пор ...

import MySQLdb 

db = MySQLdb.connect(host="xxx.com", user="xxx", passwd="xxx", db="xxx") 
c = db.cursor() 

c.execute("select * from users") 
usersss = c.fetchall() 

updates = [] 

row = 2 # starting row 

while True: 
    data = tuple(CellRange((row,1),(row,6)).value) 
    if data[0]: 
     if data not in usersss: # new record 
      updates.append(data) 
     row += 1 
    else: # end of table 
     break 

c.executemany("""INSERT INTO users (id, username, password, userid, fname, lname) VALUES (%s, %s, %s, %s, %s, %s)""", updates) 

db.commit() 
db.close() 

... как сейчас, я не получаю никаких ошибок, но моя новая строка не добавляется (ID 3). Это то, что моя таблица выглядит в Excel ...

enter image description here

база данных имеет ту же структуру, минус идентификатор 3. Там должен быть более простой способ обхода строк и тянуть уникальный контент для вставки , но через 6 часов, пробовав разные вещи (и две новые книги Python), я попрошу о помощи.

Если я бегу либо ...

print '[%s]' % ', '.join(map(str, updates)) 

или

print updates 

мой результат

[] 

Так что это, скорее всего, не пропуская никаких данных в MySQL в первую очередь ,

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ И РАБОЧАЯ SCRIPT

Не совсем то, что я хочу, но это работает для меня ...

c = db.cursor() 
row = 2 
while Cell(row,1).value != None: 
    c.execute("""INSERT IGNORE INTO users (id, username, password, userid, fname, lname) 
    VALUES (%s, %s, %s, %s, %s, %s);""", 
     (CellRange((row,1),(row,6)).value)) 
    row = row + 1 
+0

Можете ли вы исправить отступы в коде? –

ответ

0

я в конечном итоге найти решение, которое получает мне Вставить на новые и позволяет для UPDATE тех, которые изменились. Не совсем выбор Python, основанный на одном запросе, но будет делать.

import MySQLdb 

db = MySQLdb.connect("xxx","xxx","xxx","xxx") 
c = db.cursor() 
row = 2 
while Cell(row,1).value is not None: 
    c.execute("INSERT INTO users (id, username, password, \ 
    userid, fname, lname) \ 
    VALUES (%s, %s, %s, %s, %s, %s) \ 
    ON DUPLICATE KEY UPDATE \ 
    id=VALUES(id), username=VALUES(username), password=VALUES(password), \ 
    userid=VALUES(userid), fname=VALUES(fname), lname=VALUES(lname);", 
    (CellRange((row,1),(row,6)).value)) 

    row = row + 1 

db.commit() 
db.close() 
3

Вот ваша проблема:

while True: 
    if data[0]: 
     ... 
    else: 
     break 

Ваших первый id равен 0, поэтому в первой итерации цикла data[0] будет ложно, и ваш цикл выйдет, не добавив никаких данных. То, что вы, вероятно, Мента является:

while True: 
    if data[0] is not None: 
     ... 
    else: 
     break 
+0

Возможно, вы думаете о другом языке (Null не находится в Python). Но если вы посмотрите в нижней части моего сообщения, я смог сделать подобное с помощью «! = None» и фактически изменил это на «не None» в моем проекте. Я, скорее всего, положу немного больше времени на улучшение, хотя, как и для больших объемов данных, и тот, который я написал, создает несколько запросов. – Shane

+0

Да, ты прав, я не 'Нет'.Случается, когда вы отвечаете на вопросы python при написании кода Java ... :) – mata