繁体   English   中英

确定sqlite3中的最大列数

[英]Determine maximum number of columns from sqlite3

是否有可能在运行时获得sqlite3支持的最大列数? 此数据库限制是使用编译时变量SQLITE_MAX_COLUMN (请参阅限制 )。 默认值通常为2000列。

我正在寻找可从Python或SQL界面访问的东西。

从实际角度看这似乎是不可能的(即没有像dan04那样非常出色的答案的非常昂贵的蛮力方法)。

源( 12 )为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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM