Ferroman
Дек. 9, 2007 00:41:41
FoxPython
А если я хочу и Аttendees указать не напрямую, а опять же через переменную указывающую на Attendes (содержащую строку с этим именем таблицы)
А подумать? А попробовать? Интерпретатор-то зачем?
3BEP
Дек. 9, 2007 01:11:52
Т.к. 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
Дек. 10, 2007 11:47:44
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
Дек. 10, 2007 11:49:19
а также доку к модулю твоей БД
FoxPython
Дек. 12, 2007 05:19:44
Усё разобрался я, спасибо всем.
У меня база данных - 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
Дек. 12, 2007 07:42:49
Чем тебя не устраивает вариант:
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
Дек. 12, 2007 13:34:51
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
Дек. 12, 2007 18:18:16
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
Дек. 12, 2007 19:32:56
Да, точно, ошибся. Прошу прощения.
> query_params = {fam: dam, im: im, ot: ot, table: table, find_fam: fam}
Так работать не будет, нужны кавычки :)
j2a
Дек. 12, 2007 19:34:45
nss
Да, точно, ошибся. Прошу прощения.
> query_params = {fam: dam, im: im, ot: ot, table: table, find_fam: fam}
Так работать не будет, нужны кавычки :)
Да-да-да. Или переменные :)
P.S. Хехе. Еще и опечатки - нарочно не придумаешь
dam :)