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?
Merci Gord. Travaillé parfaitement :-) – tonez