2016-12-28 4 views
2

Ich bin ziemlich neu zu Python und MySql zu. Ich versuche, Daten, die in Excel-Dateien empfangen werden, mit Python in MySql zu importieren. Das Skript läuft ruhig in Ordnung, aber ich habe einen einfachen Auswahlteil, der nicht richtig funktioniert. Es wird versucht, Daten aus einer einzigen Tabelle abzurufen, die die bereits importierten Dateinamen nach Dateitypen geordnet speichert. Die Tabelle hat also diese zwei Spalten und einige hundert Zeilen.sql Alchemie Abfrage stucked je nach Wert

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; 

Das Skript läuft mit allen "Dateitypen", bis auf einen. Wenn dieser als Wert an die Auswahl gesendet wird, bleibt das Skript ohne Fehlermeldung stehen.

Das Skript mit dem Parameter "doc_type" auf "ibot" gesetzt, was es zum Stillstand bringt!

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

Das Ergebnis scheint es, Python für resultiert aus MySql wartet, aber in der db die Verbindung in „Schlaf“ ist.

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',) 

Wenn ich den gleichen Code mit anderen DOC_TYPE Wert laufen funktioniert es perfekt:

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'] 

die Auswahl in MySql Lauf funktioniert natürlich auch:

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 

Ich bin sicher, dass die Problem ist nicht der Wert des Parameters, aber bitte geben Sie mir etwas Hilfe, um zu verstehen, warum die selbe Auswahl manchmal funktioniert und in anderen Fällen nicht funktioniert. Danke

+0

Ein weiterer Kommentar. Es scheint, das Problem tritt auf, wenn die Ergebniswerte Speicherplatz im Docname enthalten! Beim Ausführen des Skripts mit –

+0

funktioniert diese Änderung, liefert aber natürlich nicht das erforderliche Ergebnis: query = "SELECT ersetzen (docname, '', '_') FROM imp_doc WHERE doc_type =% s" –

+0

Die Replace-Funktion löste sich nicht vollständig das Problem. Wenn ich die Leerzeichen durch andere Zeichen als "_" ersetze, bekomme ich ein anderes Verhalten !!! Dies scheint sehr beängstigend und macht den ganzen Code unzuverlässig. Sogar die Verwendung von ORM anstelle von Text-SQL ergibt ein ähnliches Verhalten. Das Problem scheint mit dem "mysqlconnector" verbunden zu sein. Ersetzen Sie das mit "pymysql" scheint eine Problemumgehung zur Verfügung gestellt, aber das ursprüngliche Problem bleibt. –

Antwort

0

Haben Sie versucht, die SQLAlchemy text() Funktion mit Ihrem Code zu verwenden?

z. so etwas wie dieses:

from sqlalchemy.sql import text 

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

Technisch, was du hast sieht gültig, aber text() verwendet, ist eine SQLAlchemy Best Practice für Text SQL schreiben und manchmal unerwartetes Verhalten, wenn Sie es nicht (nach meiner Erfahrung) verwenden .

+0

Danke, dass PJ sich die Zeit genommen hat, meine Frage zu beantworten. Ich habe meinen Code wie vorgeschlagen angepasst, aber der Code bleibt hängen. Jedenfalls werde ich diese Syntax von nun an für SQL verwenden. Wenn Sie die geänderte Funktion wie oben beschrieben auf den modifizierten Code anwenden, funktioniert diese Version der Abfrage ebenfalls. Irgendeine Idee warum? –

Verwandte Themen