Wydaje się to niemożliwe z praktycznego punktu widzenia (tj. Bez bardzo kosztownej metody "brute-force" na zasadzie odpowiedzi raczej dan04).
źródło (1, 2) modułu sqlite3
nie zawiera odniesienie albo do SQLITE_MAX_COLUMN
lub w czasie kompilacji ogranicza ogólnie; nie wydaje się też, aby można było uzyskać do nich dostęp z poziomu interfejsu SQL.
UPDATE:
Prosta modyfikacja dan04's solution użyć przeszukiwanie binarne znacznie przyspiesza rzeczy:
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
Running powyższy kod poprzez 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]
.. ., który dochodzi do średniego czasu pracy 30,76/150 = 0,205 sekundy (w przypadku quad-co 2,6 GHz re machine) - nie dokładnie szybka, ale prawdopodobnie bardziej użyteczna niż 15-20 sekund od "kopnięcia", aż złamie "metodę liczenia od jednego".
niesamowite podejście, +1! –