是否可以在运行时获得支持的最大列数sqlite3
?此数据库限制是通过编译时变量建立的SQLITE_MAX_COLUMN
(请参阅限制)。默认值通常为 2000 列。
我正在寻找可以从 Python 或 SQL 界面访问的东西。
这在实践中似乎是不可能的(即没有按照 dan04 相当出色的答案的非常昂贵的蛮力方法)。
模块的源代码 ( 1 , 2 )通常sqlite3
不包含SQLITE_MAX_COLUMN
对编译时限制的引用;似乎也没有任何方法可以从 SQL 界面中访问它们。
更新:
对dan04 的解决方案进行简单修改以使用二分搜索大大加快了速度:
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 GHz 四核机器上)- 不是很快,但可能比“踢到为止”的 15-20 秒更有用它打破了”从一个计数的方法。
从 Python 执行此操作的一种简单但低效的方法:
import itertools
import sqlite3
db = sqlite3.connect(':memory:')
try:
for num_columns in itertools.count(1):
db.execute('CREATE TABLE T%d (%s)' % (num_columns, ','.join('C%d' % i for i in range(num_columns))))
except sqlite3.DatabaseError as ex:
if 'too many columns' in str(ex):
print('Max columns = %d' % (num_columns - 1))