Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 9, 2007 00:41:41

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

FoxPython
А если я хочу и Аttendees указать не напрямую, а опять же через переменную указывающую на Attendes (содержащую строку с этим именем таблицы)
А подумать? А попробовать? Интерпретатор-то зачем?

Офлайн

#2 Дек. 9, 2007 01:11:52

3BEP
От:
Зарегистрирован: 2006-11-27
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

Т.к. 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.



Офлайн

#3 Дек. 10, 2007 11:47:44

dvs
От:
Зарегистрирован: 2006-05-22
Сообщения: 176
Репутация: +  3  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

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/ )



Офлайн

#4 Дек. 10, 2007 11:49:19

dvs
От:
Зарегистрирован: 2006-05-22
Сообщения: 176
Репутация: +  3  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

а также доку к модулю твоей БД



Офлайн

#5 Дек. 12, 2007 05:19:44

FoxPython
От:
Зарегистрирован: 2007-09-15
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)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-запрос было бы намного легче.



Офлайн

#6 Дек. 12, 2007 07:42:49

nss
От:
Зарегистрирован: 2007-01-06
Сообщения: 103
Репутация: +  0  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

Чем тебя не устраивает вариант:

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”. Все языковые конструкции продуманы с ее учетом.



Офлайн

#7 Дек. 12, 2007 13:34:51

FoxPython
От:
Зарегистрирован: 2007-09-15
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

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 всяких, за отсутствие лишних скобок, точек-запятучек и т.д.), но всё же такой вариант уже лучше. Будем использовать. Спасибо.



Офлайн

#8 Дек. 12, 2007 18:18:16

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

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}
Расставить переносы строк по своему усмотрению :)



Офлайн

#9 Дек. 12, 2007 19:32:56

nss
От:
Зарегистрирован: 2007-01-06
Сообщения: 103
Репутация: +  0  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

Да, точно, ошибся. Прошу прощения.

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

Так работать не будет, нужны кавычки :)



Офлайн

#10 Дек. 12, 2007 19:34:45

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

a='Иванов' print 'Фамилия %(a)s' Почему не работает?

nss
Да, точно, ошибся. Прошу прощения.

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

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

P.S. Хехе. Еще и опечатки - нарочно не придумаешь dam :)



Отредактировано (Дек. 12, 2007 19:35:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version