Найти - Пользователи
Полная версия: a='Иванов' print 'Фамилия %(a)s' Почему не работает?
Начало » Python для экспертов » a='Иванов' print 'Фамилия %(a)s' Почему не работает?
1 2 3
Ferroman
FoxPython
А если я хочу и Аttendees указать не напрямую, а опять же через переменную указывающую на Attendes (содержащую строку с этим именем таблицы)
А подумать? А попробовать? Интерпретатор-то зачем?
3BEP
Т.к. Python язык с динамической типизацией, то возможны финты типа:

>>> class One(object):
… def __init__(self):
… self.var = 1
… def __str__(self):
… return “Это класс One”

>>> one = One()
>>> print “Что это было? %s” % (one)
Что это было? Это класс One
>>> class Two(object):
… def __init__(self):
… self.var = 2

>>> two = Two()
>>> print “Что это было? %s” % (two)
Что это было? <__main__.Two object at 0xb7da652c>
>>>
И необходима явная передача параметров в шаблон. Шаблон представляет собой строку с метками, куда вставлять переданные переменные. Переменные вставляются по порядку. Количество переменных должно соответствовать количеству меток. Использование словарей опционально. И еще. Пока ты не вызвал cu.execute ты работаешь со строкой. Пока не разберешься собирай свой запрос в переменной.

>>> wordOne = “пара”
>>> wordTwo = “слов”
>>> query = “Что это? %s %s” % (wordOne, wordTwo)
>>> print query
Что это? пара слов
>>>



Для отладки и экспериментов используй интерпретатор. Просто выводи результат через print.
dvs
FoxPython
В зависимости от драйвера (модуля поддержки) БД подстановка параметров может осуществляться разными способами:
paramstyle
          
            String constant stating the type of parameter marker
            formatting expected by the interface. Possible values are
            [2]:
                'qmark'         Question mark style, 
                                e.g. '...WHERE name=?'
                'numeric'       Numeric, positional style, 
                                e.g. '...WHERE name=:1'
                'named'         Named style, 
                                e.g. '...WHERE name=:name'
                'format'        ANSI C printf format codes, 
                                e.g. '...WHERE name=%s'
                'pyformat'      Python extended format codes, 
                                e.g. '...WHERE name=%(name)s'
Читай Python Database API Specification v2.0 ( http://www.python.org/dev/peps/pep-0249/ )
dvs
а также доку к модулю твоей БД
FoxPython
Усё разобрался я, спасибо всем.
У меня база данных - sqlite
Запрос с подстановкой данных получается таким:

fam='fam'
im='im'
ot='ot'
table='anketa'
find_fam='Чикипукин'

querry=“SELECT %s, %s, %s FROM %s WHERE %s=?” %fam, im, ot, table, fam
cu.execute(querry, find_fam)
Т.е. имена полей нужно подставлять через %s, а значения полей через ?

Всё-таки это неудобно. Если значений много (sql-запрос большой с кучей условий), то замучаешься же сопоставлять какому %s какая переменная соответствует.
Да и к тому же, получается, сам текст sql-запроса выдать пользователю на обозрение не получится. Потому что там, где стоят знаки ‘?’ там они в переменной querry и останутся, т.е. будет так: ‘SELECT fam, im, ot FROM anketa WHERE fam=?’

Согласитесь, если б было так: querry=“SELECT %fam, %im, %ot FROM %table WHERE %fam=%find_fam”, то читать такой sql-запрос было бы намного легче.
nss
Чем тебя не устраивает вариант:
dict={}
dict['fam']='fam'
dict['im']='im'
dict['ot']='ot'
dict['table']='table'
dict['find_fam']='fam'
query='SELECT %(fam)s, %(im)s, %(ot)s FROM %(table)s WHERE %(fam)s=%(find_fam)s' % dict
Просто есть в питоне такая идиома, что “Explicit is better than implicit”. Все языковые конструкции продуманы с ее учетом.
FoxPython
nss
Чем тебя не устраивает вариант:
dict={}
dict['fam']='fam'
dict['im']='im'
dict['ot']='ot'
dict['table']='table'
dict['find_fam']='fam'
query='SELECT %(fam)s, %(im)s, %(ot)s FROM %(table)s WHERE %(fam)s=%(find_fam)s' % dict
Просто есть в питоне такая идиома, что “Explicit is better than implicit”. Все языковые конструкции продуманы с ее учетом.
Многа бук… знаков препинания (а мне питон приглянулся, в отличие от PHP всяких, за отсутствие лишних скобок, точек-запятучек и т.д.), но всё же такой вариант уже лучше. Будем использовать. Спасибо.
j2a
nss
dict={}
dict['fam']='fam'
dict['im']='im'
dict['ot']='ot'
dict['table']='table'
dict['find_fam']='fam'
Переменная dict, совпадающая с типом dict это нехорошо. А хорошо было б так:
query_params = dict(fam=dam, im=im, ot=ot, table=table, find_fam=fam)
или так:
query_params = {fam: dam, im: im, ot: ot, table: table, find_fam: fam}
Расставить переносы строк по своему усмотрению :)
nss
Да, точно, ошибся. Прошу прощения.

> query_params = {fam: dam, im: im, ot: ot, table: table, find_fam: fam}

Так работать не будет, нужны кавычки :)
j2a
nss
Да, точно, ошибся. Прошу прощения.

> query_params = {fam: dam, im: im, ot: ot, table: table, find_fam: fam}

Так работать не будет, нужны кавычки :)
Да-да-да. Или переменные :)

P.S. Хехе. Еще и опечатки - нарочно не придумаешь dam :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB