2014-07-13 5 views
0

Problèmes avec le code suivant. Il fait essentiellement une "table de démonstration", en remplaçant une chaîne et en exécutant une chaîne de sortie.Python 3.4 - jeu de caractères pyodbc/problème de formatage

La définition de la table

from macpath import join 
import pyodbc 
from builtins import print 
import logging 
import re 
import codecs 

#pyodbc connection 
cnxn = pyodbc.connect('Driver=Teradata;DBCName=192.168.1.103;DATABASE=testdb;UID=xxx;PWD=xxx') 

#create cursor 
cursor = cnxn.cursor() 

try: 
    cursor.execute(""" 
    show table ENVIRON1.DEPT 
    """) 
except pyodbc.Error as err: 
    logging.warning(err) 

objectlist = cursor.fetchall() 
for row in objectlist: 
      our_str = str(objectlist[0]) 
      our_str = re.sub("ENVIRON1", "ENVIRON2", our_str, flags=re.I) 
      print(our_str) 
      try: 
       cursor.execute(our_str) 
      except pyodbc.Error as err: 
       logging.warning(err) 
      except pyodbc.ProgrammingError as err: 
       logging.warning(err) 

La définition de la table est la suivante:

CREATE SET TABLE ENVIRON1.DEPT ,NO FALLBACK , 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    CHECKSUM = DEFAULT 
    (
     Key_Id SMALLINT NOT NULL 
) 
UNIQUE PRIMARY INDEX (Key_Id ); 

La sortie de impression (ourstr) est

('CREATE SET TABLE ENVIRON2.DEPT ,NO FALLBACK ,\r  NO BEFORE JOURNAL,\r  NO AFTER JOURNAL,\r  CHECKSUM = DEFAULT,\r  DEFAULT MERGEBLOCKRATIO\r  (\r  Key_Id SMALLINT NOT NULL)\rUNIQUE PRIMARY INDEX (Key_Id);',) 

La sortie de

cursor.execute(our_str) 

est

WARNING:root:('42000', "[42000] [Teradata][ODBC Teradata Driver][Teradata Database] Syntax error, expected something like a 'SELECT' keyword or '(' or a 'NONTEMPORAL' keyword or 'AS' keyword between '(' and the string 'CREATE SET TABLE ENVIRON2.DEPT ,NO FALLBACK ,\\r  NO BEFORE JOURNAL,\\r  NO AFTER JOURNAL,\\r  CHECKSUM = DEFAULT. (-3707) (SQLExecDirectW)") 

Le problème est avec le retour chariot \ r. L'instruction cursor.execute (our_str) prend le retour chariot sous la forme d'un "\ r" littéral provoquant une erreur de syntaxe.

Des conseils sur la façon de contourner ce problème?

Répondre

1

Lorsque vous

our_str = str(objectlist[0]) 

vous convertissez toute une « ligne » à une chaîne (même si cette ligne ne peut contenir qu'une seule colonne), de sorte que la chaîne sort comme

('line1\rline2',) 

Si vous extrayez la première colonne de la rangée alors vous devriez simplement obtenir la chaîne non décorée

our_str = objectlist[0][0] 

qui, lorsqu'il est imprimé devrait ressembler à

line1 
line2 

Ou, au lieu de fetchall() vous pouvez simplement faire fetchone() car il semble que vous attendez que pour récupérer une ligne de toute façon. Dans ce cas

our_str = objectlist[0] 

devrait suffire.

+0

Merci Gord. Travaillé parfaitement :-) – tonez