Уведомления

Группа в Telegram: @pythonsu

#1 Март 15, 2013 11:28:43

lobziik
Зарегистрирован: 2013-03-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite, DB-API параметр ?

Здравствуйте, не могу разобраться с параметром ? из db-api.

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
f = ('date text', 'trans text', 'symbol text', 'qty real', 'price real')
c.execute('CREATE TABLE stocks (?,?,?,?,?)', f)

На приведенный выше код получаю “sqlite3.OperationalError: near ”?“: syntax error”

А такая конструкция отрабатывает нормально:
c.execute('CREATE TABLE stocks (date text, trans text, symbol text, qty real, price real)')
conn.commit()
purchases = ('2006-03-28', 'BUY', 'IBM', 1000, 45.00)
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)

Так как же мне подставлять имена столбцов в таблице? Подскажите пожалуйста.

Офлайн

#2 Март 15, 2013 12:02:14

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

sqlite, DB-API параметр ?

Похоже что параметризация в Cursor.execute не применяется к DDL.

Офлайн

#3 Март 15, 2013 12:53:38

Loki
Зарегистрирован: 2013-03-13
Сообщения: 28
Репутация: +  4  -
Профиль   Отправить e-mail  

sqlite, DB-API параметр ?

Мне кажется Вам стоить подготовить строку запроса заранее:

var = 'CREATE TABLE stocks ({0},{1},{2},{3},{4})'.format('date text', 'trans text',
                                                         'symbol text', 'qty real',
                                                         'price real')

А потом выполнять execute…

Отредактировано Loki (Март 15, 2013 12:54:21)

Офлайн

#4 Март 15, 2013 14:06:48

lobziik
Зарегистрирован: 2013-03-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite, DB-API параметр ?

Shaman
Похоже что параметризация в Cursor.execute не применяется к DDL.
В смысле к операциям типа CREATE, DROP и тп.?

Loki
Мне кажется Вам стоить подготовить строку запроса заранее:
Проблема в том, что столбцов у меня около 50ти, возможно увеличение. Названия и количество берутся из первой строки текстового фалика, т.е получаем список необходимых столбцов. Каким еще образом это решить, я придумать пока не могу.

Офлайн

#5 Март 15, 2013 14:40:32

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

sqlite, DB-API параметр ?

lobziik
В смысле к операциям типа CREATE, DROP и тп.?
Да. Но утверждать не буду - этот момент в документации не освещен, а я с таким случаем не сталкивался.
lobziik
Проблема в том, что столбцов у меня около 50ти, возможно увеличение.
50 - это не проблема. Строковые шаблоны справятся.
Никто не запрещает параметризовать и сам шаблон:
f = ('date text', 'trans text', 'symbol text', 'qty real', 'price real')
c.execute('CREATE TABLE stocks (%s)'  % ','.join(['%s'] * len(f)) % f)

Отредактировано Shaman (Март 15, 2013 15:49:30)

Офлайн

#6 Март 16, 2013 09:57:30

lobziik
Зарегистрирован: 2013-03-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite, DB-API параметр ?

Shaman
50 - это не проблема. Строковые шаблоны справятся.
Никто не запрещает параметризовать и сам шаблон:
Немножко не так сделал, но идея в общем такая.
С DDL параметризация и правда не работает видать. Со вставками все ок.
Спасибо.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version