Questo sembra essere impossibile in termini pratici (cioè senza un approccio di forza bruta molto costoso sulla falsariga della risposta piuttosto brillante di dan04).
La fonte (1, 2) per il modulo sqlite3
contiene alcun riferimento né SQLITE_MAX_COLUMN
o compilare tempo limiti in generale; né sembra esserci alcun modo per accedervi dall'interno dell'interfaccia SQL.
UPDATE:
una semplice modifica di dan04's solution usare una ricerca binaria accelera le cose in modo considerevole:
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
L'esecuzione del codice di cui sopra attraverso 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]
.. che raggiunge un tempo di esecuzione medio di 30.76/150 = 0.205 secondi (su un quad-co a 2.6 GHz re machine) - non esattamente veloce, ma probabilmente più utilizzabile dei 15-20 secondi del metodo "calcola fino a quando non si rompe" da un metodo.
fonte
2013-07-26 04:31:00
approccio Impressionante, +1! –