Это представляется невозможным в практическом плане (т. Е. Без очень дорогого подхода грубой силы вдоль линий довольно блестящего ответа dan04).
Источник (1, 2) для sqlite3
модуля не содержит ссылок ни на SQLITE_MAX_COLUMN
или во время компиляции пределы в целом; также нет никакого способа получить к ним доступ из интерфейса SQL.
UPDATE:
Простая модификация dan04's solution использовать бинарный поиск ускоряет вещи значительно:
import sqlite3
def max_columns():
db = sqlite3.connect(':memory:')
low = 1
high = 32767 # hard limit <http://www.sqlite.org/limits.html>
while low < high - 1:
guess = (low + high) // 2
try:
db.execute('CREATE TABLE T%d (%s)' % (
guess, ','.join('C%d' % i for i in range(guess))
))
except sqlite3.DatabaseError as ex:
if 'too many columns' in str(ex):
high = guess
else:
raise
else:
low = guess
return low
Выполнение кода выше через timeit.repeat()
:
>>> max_columns()
2000
>>> import timeit
>>> timeit.repeat(
... "max_columns()",
... setup="from __main__ import max_columns",
... number=50
...)
[10.347190856933594, 10.0917809009552, 10.320987939834595]
.. , который достигает среднего времени выполнения 30,76/150 = 0,205 секунд (на четырехъядерном процессоре 2,6 ГГц re machine) - не совсем быстрый, но, вероятно, более полезный, чем 15-20 секунд «пинайте его, пока он не сломает» метод подсчета с одного.
Удивительный подход, +1! –