Найти - Пользователи
Полная версия: sqlite, DB-API параметр ?
Начало » Python для новичков » sqlite, DB-API параметр ?
1
lobziik
Здравствуйте, не могу разобраться с параметром ? из 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)

Так как же мне подставлять имена столбцов в таблице? Подскажите пожалуйста.
Shaman
Похоже что параметризация в Cursor.execute не применяется к DDL.
Loki
Мне кажется Вам стоить подготовить строку запроса заранее:
var = 'CREATE TABLE stocks ({0},{1},{2},{3},{4})'.format('date text', 'trans text',
                                                         'symbol text', 'qty real',
                                                         'price real')

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

Loki
Мне кажется Вам стоить подготовить строку запроса заранее:
Проблема в том, что столбцов у меня около 50ти, возможно увеличение. Названия и количество берутся из первой строки текстового фалика, т.е получаем список необходимых столбцов. Каким еще образом это решить, я придумать пока не могу.
Shaman
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)
lobziik
Shaman
50 - это не проблема. Строковые шаблоны справятся.
Никто не запрещает параметризовать и сам шаблон:
Немножко не так сделал, но идея в общем такая.
С DDL параметризация и правда не работает видать. Со вставками все ок.
Спасибо.
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