Форум сайта python.su
FoxPythonА подумать? А попробовать? Интерпретатор-то зачем?
А если я хочу и Аttendees указать не напрямую, а опять же через переменную указывающую на Attendes (содержащую строку с этим именем таблицы)
Офлайн
Т.к. 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.
Офлайн
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'
Офлайн
а также доку к модулю твоей БД
Офлайн
Усё разобрался я, спасибо всем.
У меня база данных - 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-запрос было бы намного легче.
Офлайн
Чем тебя не устраивает вариант:
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
Офлайн
nssМнога бук… знаков препинания (а мне питон приглянулся, в отличие от PHP всяких, за отсутствие лишних скобок, точек-запятучек и т.д.), но всё же такой вариант уже лучше. Будем использовать. Спасибо.
Чем тебя не устраивает вариант:Просто есть в питоне такая идиома, что “Explicit is better than implicit”. Все языковые конструкции продуманы с ее учетом.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
Офлайн
nssПеременная dict, совпадающая с типом dict это нехорошо. А хорошо было б так:dict={}
dict['fam']='fam'
dict['im']='im'
dict['ot']='ot'
dict['table']='table'
dict['find_fam']='fam'
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}
Офлайн
Да, точно, ошибся. Прошу прощения.
> 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}
Так работать не будет, нужны кавычки :)
Отредактировано (Дек. 12, 2007 19:35:43)
Офлайн