Найти - Пользователи
Полная версия: sqlalchemy ругается на занк "%" в строке запроса
Начало » Базы данных » sqlalchemy ругается на занк "%" в строке запроса
1
wNomad
Привет всем :)

Вот нужно выполнить элементарный запрос к базе 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 сервера.

Буду признателен за любую помощь.
Андрей Светлов
Если говорим именно об sqlalchemy - попробуц переделать на
db.execute( text(r'SELECT ID FROM %s WHERE BINARY URL = "%s";' %(table_name,some_string)) )
db создавал через create_engine

Только несколько непрофильное использоввание - через алхимию raw запросы гонять
wNomad
Спасибо за совет. Но text() не помогает. Все равно db.execute( text(“%s”) ) приводит к TypeError. :(

Только несколько непрофильное использоввание - через алхимию raw запросы гонять
Да, конечно. Везде в скрипте я использую доступ через функции sqlalchemy и методы класса Table. (без orm). Но не смог найти, как задать BINARY в условии WHERE, поэтому и пытаюсь через текстовый запрос.
Может быть, Вы знаете как задать BINARY?
FoxPython
А если попробовать вытащить текст 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)
slav0nic
пиши через запятую
db.execute( r'SELECT ID FROM %s WHERE BINARY URL = “%s”;', (table_name,some_string) )
работать с запросами как со строками - глупо и небезопасно
FoxPython
slav0nic
А мне на этом же форуме так делать и посоветовали.

r - для чего? Что она делает?
Vach
FoxPython
slav0nic
А мне на этом же форуме так делать и посоветовали.

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

>>> print r'line1\nline2'
line1\nline2
Naota
Можно сделать чтото типа такого:
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()
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