2013-09-25 3 views
-4

У меня есть две почти идентичные программы. Один работает, другой - нет. Программа, которая не работает, отображает ошибку «недостаточно аргументов для строки формата». Вероятно, это связано с «%» в переменной dbname, но я не могу понять, почему работает одна программа, а другая - нет. В обеих программах я пытаюсь использовать подстановочный знак в инструкции SELECT с LIKE.Недостаточно аргументов - в чем разница

Рабочая программа:

import subprocess 
import sys 
import commands 
from sqlalchemy import create_engine 
from sqlalchemy import Date, DateTime 
from sqlalchemy import create_engine  
from sqlalchemy import MetaData, Column, Table, ForeignKey 
from sqlalchemy import Integer, String 
from sqlalchemy.sql import select 

engine = create_engine('mysql://UID:[email protected]:9999/access_benchmark_staging', echo=True) 
dest = engine.connect() 
dest.execute("truncate table TABAUTH") 


def dbapull(applid, ssid, host, port, dbname): 
    print "dbapull " + dbname + "" 
    source = pyodbc.connect('Driver={IBM DB2 ODBC DRIVER};Database=' + ssid +';Hostname=' + host + ';Port=' + port + ';Protocol=TCPIP;Uid=user;Pwd=password', echo=True) 
    src = source.cursor() 
    src.execute("SELECT DISTINCT SUBSTR(CURRENT SERVER,1,7) AS SSID, SUBSTR(B.GRANTEE,1,8) AS GRANTEE, B.UPDATEAUTH AS U, B.INSERTAUTH AS I, B.DELETEAUTH AS D, A.CREATOR, B.DBNAME, B.TTNAME, B.ALTERAUTH AS C FROM " + ssid + ".SYSIBM.SYSTABLES A LEFT JOIN " + ssid + ".SYSIBM.SYSTABAUTH B ON A.CREATOR = B.TCREATOR AND A.NAME = B.TTNAME WHERE A.CREATOR IN ('PFPROD','PGPROD','PSPROD','PS','PROD') AND A.DBNAME LIKE " + dbname + " AND (B.UPDATEAUTH <> ' ' OR B.INSERTAUTH <> ' ' OR B.DELETEAUTH <> ' ') AND A.TYPE IN ('T','V') AND B.GRANTEETYPE = ' ' AND A.NAME NOT IN ('DSN_VIEWREF_TABLE','DSN_PGRANGE_TABLE','DSN_SORTKEY_TABLE','DSN_SORT_TABLE','DSN_DETCOST_TABLE','DSN_FILTER_TABLE','DSN_PTASK_TABLE','DSN_STATEMNT_TABLE','DSN_PGROUP_TABLE','DSN_STRUCT_TABLE','DSN_PREDICAT_TABLE','PLAN_TABLE') ORDER BY 2") 
    for row in src: 
     #print (row) 
     row[0] = str(row[0]).strip() 
     row[1] = str(row[1]).strip() 
     row[2] = str(row[2]).strip() 
     row[3] = str(row[3]).strip() 
     row[4] = str(row[4]).strip() 
     row[5] = str(row[5]).strip() 
     row[6] = str(row[6]).strip() 
     row[7] = str(row[7]).strip() 
     row[8] = str(row[8]).strip() 
     result = dest.execute("insert ignore into TABAUTH values ('" + applid + "','" + row[0] + "','" + row[1] + "','" + row[2] + "','" + row[3] + "','" + row[4] + "','" + row[5] + "','" + row[6] + "','" + row[7] + "','" + row[8] + "')") 

dbapull("AAA", "BBB", "CCC", "DDD", "'%PMC%'") 

dest.close() 

Неработающий программа:

import subprocess 
import sys 
import commands 
from sqlalchemy import create_engine 
from sqlalchemy import Date, DateTime 
from sqlalchemy import create_engine  
from sqlalchemy import MetaData, Column, Table, ForeignKey 
from sqlalchemy import Integer, String 
from sqlalchemy.sql import select 

engine = create_engine('mysql://UID:[email protected]:9999/access_benchmark_staging', echo=True) 
dest = engine.connect() 
dest.execute("truncate table DS_Users") 


def userpull(appl, dbname): 
    print "DS User pull " + dbname + " " 
    source = create_engine('mysql://UID:[email protected]:9999/access_benchmark_staging', echo=True) 
    src = engine.connect() 
    src.execute("SELECT MF.profile_name AS profile_name, MF.groupuser_access as groupuser_access, MF.group_id as group_id, MF.user_id as user_id, MF.user_name as user_name, MF.default_group as default_group, MF.last_racinit as last_racinit, MF.password_last_changed_date as password_last_changed_date, MF.user_id_status as user_id_status, MF.creation_date as creation_date, ldap.uid as uid, ldap.company as company, ldap.emp_name as emp_name, ldap.title as title, ldap.contract_exp as contact_exp, ldap.dept_name as dept_name, ldap.emp_status as emp_status, ldap.disabled_date as disabled_date, ldap.term_date as term_date, ldap.bus_unit as bus_unit, ldap.manager_id as manager_id FROM (SELECT DST.profile_name, DST.groupuser_access, GRP.group_id, USR.user_id, USR.user_name, USR.default_group, USR.last_racinit, USR.password_last_changed_date, USR.user_id_status, USR.creation_date FROM AU_KRC_USER_REPORT USR INNER JOIN AU_KRC_GROUP_REPORT GRP ON USR.user_id = GRP.user_id INNER JOIN AU_KRC_DATASET_REPORT DST ON GRP.group_id = DST.groupuser_id WHERE (DST.profile_name LIKE " + dbname + " AND DST.profile_name NOT IN ('" + appl + ".SYSINFO.ABEND')) AND DST.groupuser_access IN ('UPDAT', 'ALTER') AND DST.groupuser_type = 'GROUP') MF LEFT OUTER JOIN ldap.ldap_raw ldap ON MF.user_id = ldap.kmart_mf GROUP BY MF.group_id, MF.user_id, MF.user_name, MF.default_group, MF.last_racinit, MF.password_last_changed_date, MF.user_id_status, MF.creation_date, ldap.uid, ldap.company, ldap.emp_name,ldap.title, ldap.contract_exp, ldap.dept_name, ldap.emp_status, ldap.disabled_date, ldap.term_date, ldap.bus_unit, ldap.manager_id") 
    for row in src: 
     #print (row) 
     row[0] = str(row[0]).strip() 
     row[1] = str(row[1]).strip() 
     row[2] = str(row[2]).strip() 
     row[3] = str(row[3]).strip() 
     row[4] = str(row[4]).strip() 
     row[5] = str(row[5]).strip() 
     row[6] = str(row[6]).strip() 
     row[7] = str(row[7]).strip() 
     row[8] = str(row[8]).strip() 
     row[9] = str(row[9]).strip() 
     row[10] = str(row[10]).strip() 
     row[11] = str(row[11]).strip() 
     row[12] = str(row[12]).strip() 
     row[13] = str(row[13]).strip() 
     row[14] = str(row[14]).strip() 
     row[15] = str(row[15]).strip() 
     row[16] = str(row[16]).strip() 
     row[17] = str(row[17]).strip() 
     row[18] = str(row[18]).strip() 
     row[19] = str(row[19]).strip() 
     row[20] = str(row[20]).strip() 
     result = dest.execute("insert ignore into DS_Users values ('" + appl +"','" + row[0] + "','" + row[1] + "','" + row[2] + "','" + row[3] + "','" + row[4] + "','" + row[5] + "','" + row[6] + "','" + row[7] + "','" + row[8] + "','" + row[9] + "','" + row[10] + "','" + row[11] + "','" + row[12] + "','" + row[13] + "','" + row[14] + "','" + row[15] + "','" + row[16] + "','" + row[17] + "','" + row[18] + "','" + row[19] + "','" + row[20] + "')") 

userpull("PP", "'%PP.%'") 
+4

слишком много кода здесь, придумайте минимальный пример –

+0

yuck, без форматирования. Не читается – Vorsprung

+0

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

ответ

0

Попробуйте поставить SQL в транзакции, и проверить, если драйвер, который вы используете для БД поддерживают «%» для запросов.

+0

По крайней мере, это предложение имело конструктивное предложение. Да, я попытался запустить запрос непосредственно в MySQL Workbench с помощью%, и он вернул желаемые результаты. Я все еще новичок в PYTHON и не имею всех колоколов и свистов, разработанных для точной науки. Кодирование может быть не очень красивым, но это не объясняет, почему оно работает в одном экземпляре, а не в другом. – geetarman

+0

Вот трассировка - я надеюсь, что это в нужном формате.Traceback (последний последний вызов): Файл «C: \ Python27 \ lib \ site-packages \ MySQLdb \ cursors.py», строка 183, в выполнить query = query% db.literal (args) ТипError: недостаточно аргументов для строки формата – geetarman

+0

Я нашел решение. % Должно быть в парах. Я изменил параметр на «PP. %%», и он сработал. Конечно, остальная часть кода должна быть «очищена», но, по крайней мере, я получаю желаемые результаты. – geetarman

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