Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 11, 2007 14:14:25

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

sqlalchemy ругается на занк "%" в строке запроса

Привет всем :)

Вот нужно выполнить элементарный запрос к базе MySQL:

db.execute( r'SELECT ID FROM %s WHERE BINARY URL = "%s";' %(table_name,some_string) )
db создавал через create_engine

И если в some_string встречается “%”, вылетает ошибка: (TypeError) not enough arguments for format string

Перерыл уже все что мог, не понимаю, зачем execute воспринимает эту строку, как строку с параметрами, и как указать ему, что это просто строка? Даже если задать просто db.execute( “%s” ) все равно вылетит этот TypeError, а не SyntaxError от MySQL сервера.

Буду признателен за любую помощь.



Отредактировано (Окт. 11, 2007 14:19:31)

Офлайн

#2 Окт. 11, 2007 14:42:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

sqlalchemy ругается на занк "%" в строке запроса

Если говорим именно об sqlalchemy - попробуц переделать на

db.execute( text(r'SELECT ID FROM %s WHERE BINARY URL = "%s";' %(table_name,some_string)) )
db создавал через create_engine

Только несколько непрофильное использоввание - через алхимию raw запросы гонять



Офлайн

#3 Окт. 11, 2007 16:25:32

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

sqlalchemy ругается на занк "%" в строке запроса

Спасибо за совет. Но text() не помогает. Все равно db.execute( text(“%s”) ) приводит к TypeError. :(

Только несколько непрофильное использоввание - через алхимию raw запросы гонять
Да, конечно. Везде в скрипте я использую доступ через функции sqlalchemy и методы класса Table. (без orm). Но не смог найти, как задать BINARY в условии WHERE, поэтому и пытаюсь через текстовый запрос.
Может быть, Вы знаете как задать BINARY?



Офлайн

#4 Дек. 26, 2007 14:23:25

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

sqlalchemy ругается на занк "%" в строке запроса

А если попробовать вытащить текст sql-запроса в отдельную текстовую переменную, а потом уже подсовывать её execute'у?
Типа: querry=“SELECT ID FROM %s WHERE BINARY URL = %s” %(table_name, some_string)
db.execute(querry)

Кстати, возможно вторую %s следует заменить на ? (знак вопроса), а some_string убрать из текстовой строки и добавить в качестве параметра к execute'у, т.е.:
querry=“SELECT ID FROM %s WHERE BINARY URL = ?” %(table_name)
db.execute(querry, some_string)



Офлайн

#5 Дек. 26, 2007 17:07:53

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

sqlalchemy ругается на занк "%" в строке запроса

пиши через запятую
db.execute( r'SELECT ID FROM %s WHERE BINARY URL = “%s”;', (table_name,some_string) )
работать с запросами как со строками - глупо и небезопасно

Офлайн

#6 Дек. 30, 2007 18:10:31

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

sqlalchemy ругается на занк "%" в строке запроса

slav0nic
А мне на этом же форуме так делать и посоветовали.

r - для чего? Что она делает?



Офлайн

#7 Янв. 25, 2008 17:08:55

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

sqlalchemy ругается на занк "%" в строке запроса

FoxPython
slav0nic
А мне на этом же форуме так делать и посоветовали.

r - для чего? Что она делает?
>>> print 'line1\nline2'
line1
line2

>>> print r'line1\nline2'
line1\nline2



Офлайн

#8 Май 12, 2008 13:18:11

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

sqlalchemy ругается на занк "%" в строке запроса

Можно сделать чтото типа такого:

from sqlalchemy.sql import select
from sqlalchemy import text
select([table_name.c.id], text("BINARY %s" % (test_table.c.url==some_string)))
Или так к примеру:
>>> from sqlalchemy.sql import text
>>> s = text("""SELECT users.fullname || ', ' || addresses.email_address AS title 
...            FROM users, addresses 
...            WHERE users.id = addresses.user_id AND users.name BETWEEN :x AND :y AND 
...            (addresses.email_address LIKE :e1 OR addresses.email_address LIKE :e2)
...        """)
sql>>> print conn.execute(s, x='m', y='z', e1='%@aol.com', e2='%@msn.com').fetchall()



Отредактировано (Май 12, 2008 13:21:33)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version