2013-07-08 3 views
0

Я написал код python для подключения к базе данных MySQL, откройте текстовый файл и для каждой записи в текстовом файле выполните запрос и запишите результат в выходной файл. Вместо того, чтобы записывать результат каждого запроса в выходной файл, однако записывается только один результат. Если в запросе, который я использую, нет аргументов, все работает отлично. Проблема возникает только при попытке добавить аргументы.Запрос MySQL с Python не возвращает все результаты

Я довольно новичок в Python, поэтому я могу совершить глупую ошибку, но мне еще не удалось найти ничего, что помогло бы, поэтому любая помощь была бы весьма признательна.

код у меня есть:

output = open("results.txt", "w+") 

cnx= mysql.connector.connect(**config) 
cursor = cnx.cursor()      

with open("input.txt") as i: 
    for line in i:         

     # Construct query to get type 
     query = ("select type from table1, table2 " 
     "where table1.name = %s and table1.id = table2.id") 

     # Query arguments 
     args = (line) 

     cursor.execute(query, args)   # Execute query 

     for entry in cursor:     
      output.write(str(entry) + "\n") 

cursor.close()          
cnx.close() 
+0

ли вы закрыть файл, используя 'output.close() '? Если нет, возможно, данные теряются в выходном буфере. – dnet

+1

Для записи: «args = (line)» должно быть «args = (line,)», но см. Ответ joente для реального исправления. – geertjanvdk

ответ

1

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

output = open('myoutputfile.txt', 'w') 
cnx = mysql.connector.connect(**config) 
cursor = cnx.cursor()      

# Construct query to get type, there's no need to include this in the loop 
query = ("""SELECT type FROM table1, table2 
    WHERE table1.name = %s AND table1.id = table2.id""") 

with open("input.txt") as f: 
    for line in f:         

     # Query arguments 
     args = (line.strip(),) # added .strip() 

     cursor.execute(query, args)  # Exec query 

     entries = cursor.fetchall() 
     for entry in entries:     
      output.write(str(entry[0]) + "\n") 

cnx.close() 
output.close() 
+0

Это не работает для меня, к сожалению. Я получаю тот же результат, что и изначально. Я проверил запрос вручную, чтобы я знал, что он определенно работает. Он работает, если у запроса нет аргументов, но как только они добавлены в него, он просто дает единственный результат. – Riddle

+0

Я немного изменил код. (добавлен .strip() в аргумент строки). Возможно, это решает вашу проблему, потому что я предполагаю, что символ конца строки включен иначе ... – joente

+0

Это именно то, что было, большое вам спасибо: D – Riddle

0

Вы не открывая выходной файл для записи, по крайней мере, в части кода вы опубликовали.

 for entry in cursor: 
      ## what output? when and how was it opened?    
      output.write(str(entry) + "\n") 

Вы уже открыли «output.txt» с режимом «w» (который обозначает для записи)? В этом коде вы только открытие «input.txt» файл в строке 4. Если вы хотите записать в файл «input.txt» в режиме добавления код должен быть:

i.write(str(entry) + "\n") 

(и файл должен быть открыт в режиме добавления или записи). Также в аргументах запроса вам не нужно передавать четыре строки. В вашем запросе вы подаете только один параметр (table1.name =% s), вам нужно передать только этот параметр% s, который, я думаю, будет строкой.

+0

Я открыл выходной файл перед открытием соединения. Должен был включить это извините, но я обновил код, который я опубликовал сейчас. Некоторые вещи записываются в выходной файл, но не все они есть. Что касается наличия слишком большого количества параметров, это была просто ошибка в том, что я опубликовал. У меня все в порядке и исправлено здесь, извините. – Riddle

Смежные вопросы