2016-12-28 2 views
2

Я довольно новичок в python и MySql. Я пытаюсь импортировать данные, полученные в файлах excel, в MySql, используя python. Скрипты работают тихо, но у меня есть простая часть выбора, которая работает неправильно. Он пытается получить данные из одной таблицы, хранящей уже импортированные имена файлов, классифицированные по типам файлов. Таким образом, таблица имеет эти две колонки и несколько сотен строк.sql alchemy query get stucked в зависимости от значения

CREATE TABLE `imp_doc` (
    `docname` varchar(50) NOT NULL, 
    `doc_type` varchar(12) DEFAULT NULL, 
    PRIMARY KEY (`docname`), 
    KEY `doctype` (`doc_type`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Сценарий работает со всеми типами файлов, кроме одного. Когда этот параметр отправляется как значение для выбора, сценарий останавливается без сообщения об ошибке.

Сценарий с параметром «doc_type», установленным на «ibot», который заставляет его сваливаться!

import sqlalchemy 
from sqlalchemy import create_engine 
from sqlalchemy.pool import NullPool 

engine = create_engine('mysql+mysqlconnector://userid:[email protected]:3306/mydb', poolclass = NullPool) 
engine.echo = True 
conn = engine.connect() 

saved_list =[] 
doc_type="ibot" 
query = "SELECT docname FROM imp_doc WHERE doc_type = %s" 
cur=conn.execute(query, (doc_type,)) 
for (docname) in cur: 
    dn=docname[0] 
    dn=unicode.encode(dn,'cp1252') 
    saved_list.append(str(dn)) 
print saved_list 
cur.close() 

В результате, кажется, питон ждет результата от MySql, но в дб соединение находится в «сне».

2016-12-28 14:18:15,407 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode' 
2016-12-28 14:18:15,407 INFO sqlalchemy.engine.base.Engine {} 
2016-12-28 14:18:15,598 INFO sqlalchemy.engine.base.Engine SELECT DATABASE() 
2016-12-28 14:18:15,598 INFO sqlalchemy.engine.base.Engine {} 
2016-12-28 14:18:15,987 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1 
2016-12-28 14:18:15,997 INFO sqlalchemy.engine.base.Engine {} 
2016-12-28 14:18:16,187 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1 
2016-12-28 14:18:16,187 INFO sqlalchemy.engine.base.Engine {} 
2016-12-28 14:18:16,747 INFO sqlalchemy.engine.base.Engine SELECT docname FROM imp_doc WHERE doc_type = %s 
2016-12-28 14:18:16,757 INFO sqlalchemy.engine.base.Engine ('ibot',) 

Когда я запускаю тот же код с другим значением doc_type он отлично работает:

2016-12-28 14:31:45,105 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode' 
2016-12-28 14:31:45,105 INFO sqlalchemy.engine.base.Engine {} 
2016-12-28 14:31:45,306 INFO sqlalchemy.engine.base.Engine SELECT DATABASE() 
2016-12-28 14:31:45,306 INFO sqlalchemy.engine.base.Engine {} 
2016-12-28 14:31:45,727 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1 
2016-12-28 14:31:45,727 INFO sqlalchemy.engine.base.Engine {} 
2016-12-28 14:31:45,947 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1 
2016-12-28 14:31:45,957 INFO sqlalchemy.engine.base.Engine {} 
2016-12-28 14:31:46,507 INFO sqlalchemy.engine.base.Engine SELECT docname FROM imp_doc WHERE doc_type = %s 
2016-12-28 14:31:46,507 INFO sqlalchemy.engine.base.Engine ('wiz',) 
['WIZARD_2015-W1001-20160102.xlsx', 'WIZARD_2016-W0104-20160612.xlsx', 'WIZARD_2016-W16.xlsx', 'WIZARD_2016-W17.xlsx', 'WIZARD_2016-W18.xlsx', 'WIZARD_2016-W19.xlsx', 'WIZARD_2016-W20.xlsx', 'WIZARD_2016-W21.xlsx', 'WIZARD_2016-W22.xlsx', 'WIZARD_2016-W23.xlsx', 'WIZARD_2016-W24.xlsx', 'WIZARD_2016-W25.xlsx', 'WIZARD_2016-W26.xlsx', 'WIZARD_2016-W27.xlsx', 'WIZARD_2016-W28.xlsx', 'WIZARD_2016-W29.xlsx', 'WIZARD_2016-W30.xlsx', 'WIZARD_2016-W31.xlsx', 'WIZARD_2016-W32.xlsx', 'WIZARD_2016-W33.xlsx', 'WIZARD_2016-W34.xlsx', 'WIZARD_2016-W35.xlsx', 'WIZARD_2016-W36.xlsx', 'WIZARD_2016-W37.xlsx', 'WIZARD_2016-W38.xlsx', 'WIZARD_2016-W39.xlsx', 'WIZARD_2016-W40.xlsx', 'WIZARD_2016-W41.xlsx', 'WIZARD_2016-W42.xlsx', 'WIZARD_2016-W43.xlsx', 'WIZARD_2016-W44.xlsx', 'WIZARD_2016-W45.xlsx', 'WIZARD_2016-W46.xlsx', 'WIZARD_2016-W47.xlsx', 'WIZARD_2016-W48.xlsx', 'WIZARD_2016-W49.xlsx', 'WIZARD_2016-W50.xlsx'] 

Запуск выберите в MySql работает, конечно, тоже:

docname         doc_type  
Hotspot Detail 2.0 iBot_20161226.xlsx ibot 
Hotspot Detail 2.0 iBot_20161225.xlsx ibot 
Hotspot Detail 2.0 iBot_20161224.xlsx ibot 
20161226 def.xlsx      def 
20161225 def.xlsx      def 
20161224 def.xlsx      def 
20161223 def.xlsx      def 

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

+0

Еще один комментарий. Кажется, проблема возникает, когда значения результата содержат пробел в имени документа! Запуск сценария с помощью –

+0

эта модификация работает, но, разумеется, не дает требуемого результата: query = "SELECT replace (docname, '', '_') FROM imp_doc WHERE doc_type =% s" –

+0

Функция замены не решалась полностью проблема. На самом деле, если я заменяю пробелы разными символами, чем «_», я получаю другое поведение !!! Это кажется очень страшным и делает весь код ненадежным. С помощью ORM istead текстового SQL дает аналогичное поведение. Кажется, что проблема связана с «mysqlconnector». Замена этого на «pymysql» представляется обходным путем, но исходная проблема остается. –

ответ

0

Вы пытались использовать функцию SQLAlchemy text() с кодом?

E.g. что-то вроде этого:

from sqlalchemy.sql import text 

query = text("SELECT docname FROM imp_doc WHERE doc_type = :type") 
cur=conn.execute(query, type=doc_type) 

Технически то, что у вас есть выглядит действительно, но с использованием text() является наилучшей практикой SQLAlchemy для написания текстового SQL и иногда вы получаете неожиданное поведение, если вы не используете его (по моему опыту) ,

+0

Спасибо PJ, взяв время, чтобы ответить на мой вопрос. Я адаптировал свой код, как вы предлагали, но все же код застрял. Во всяком случае, я буду использовать этот синтаксис для текстового SQL. Применяя к модифицированному коду, функция замещения, описанная выше, также делает эту версию запроса. Любая идея почему? –

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