Как курсоры работают в API DB Python?

Чтобы избежать длительных и ненадежных тасов, я бы сделал следующее ...

  1. Создайте массив, который содержит число от 1 до 100, в порядке.
  2. Создайте случайное число от 1 до 100
  3. Посмотрите номер в этом индексе в массиве и сохраните в своих результатах
  4. Удалите элемент из массива, сделав его одним короче
  5. Повторите шаг 2, но используйте 99 как верхний предел случайного числа
  6. Повторите с шага 2, но используйте 98 в качестве верхнего предела случайного числа
  7. Повторите шаг 2, но используйте 97 как верхний предел случайного числа
  8. Повторите с шага 2, но используйте 96 как верхний предел случайного числа
  9. Повторите из шага 2, но используйте 95 как верхний предел случайного числа
  10. Повторите с шага 2, но используйте 94 как верхний предел случайного числа
  11. Повторите с шага 2, но используйте 93 как верхний предел случайного числа

Voila - нет повторных чисел.

Я могу опубликовать некоторые фактические код позже, если кому-то интересно.

Редактирование: это, вероятно, конкурентная полоса во мне, но, увидев сообщение от @Alsciende, я не смог устоять, отправив код, который я обещал.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>8 unique random number between 1 and 100</title>
<script type="text/javascript" language="Javascript">
    function pick(n, min, max){
        var values = [], i = max;
        while(i >= min) values.push(i--);
        var results = [];
        var maxIndex = max;
        for(i=1; i <= n; i++){
            maxIndex--;
            var index = Math.floor(maxIndex * Math.random());
            results.push(values[index]);
            values[index] = values[maxIndex];
        }
        return results;
    }
    function go(){
        var running = true;
        do{
            if(!confirm(pick(8, 1, 100).sort(function(a,b){return a - b;}))){
                running = false;
            }
        }while(running)
    }
</script>
</head>

<body>
    <h1>8 unique random number between 1 and 100</h1>
    <p><button onclick="go()">Click me</button> to start generating numbers.</p>
    <p>When the numbers appear, click OK to generate another set, or Cancel to stop.</p>
</body>

28
задан cdleary 20 January 2009 в 02:42
поделиться

3 ответа

да, я знаю, что ему уже несколько месяцев: Курсор P

DB-API, похоже, очень похож на курсоры SQL. Это касается управления ресурсами (строками) AFA, DB-API не указывает, должен ли клиент получить все строки или ОБЪЯВИТЬ фактический курсор SQL . Пока интерфейсы fetchXXX делают то, что должны, DB-API доволен.

AFA-курсоры psycopg2 касаются (как вы, возможно, хорошо знаете), «безымянные курсоры DB-API» будут извлекать весь набор результатов - -AFAIK буферизуется в памяти с помощью libpq. «именованные курсоры DB-API» (концепция psycopg2, которая может быть непереносимой) будет запрашивать строки по запросу (методы fetchXXX).

Как указано в «неизвестном», выполнение может использоваться для оптимизации нескольких запусков одного и того же команда. Однако это не так. t приспособиться к необходимости подготовленных отчетов; когда повторное выполнение оператора с разными наборами параметров не является прямым последовательным, executemany () будет работать так же, как execute (). DB-API «предоставляет» авторам драйверов возможность кэшировать выполненные операторы, но его реализация (какова область действия / время жизни оператора?) Не определена, поэтому невозможно установить ожидания для реализаций DB-API.

Если вы загружаете много данных в PostgreSQL, я настоятельно рекомендую попробовать найти способ использовать COPY.

7
ответ дан 28 November 2019 в 03:56
поделиться

Предполагая, что вы используете PostgreSQL, курсоры, вероятно, просто реализованы с использованием собственного API-интерфейса курсора базы данных. Возможно, вы захотите взглянуть на исходный код для pg8000 , чистого модуля DB-API Python PostgreSQL, чтобы увидеть, как он обрабатывает курсоры. Вы также можете посмотреть документацию PostgreSQL для курсоров .

2
ответ дан kquinn 14 October 2019 в 12:09
поделиться

Когда Вы смотрите здесь mysqldb документация , Вы видите, что они реализовали различные стратегии курсоров. Таким образом, общий ответ: это зависит.

Редактирование: Вот mysqldb документация API . Существует некоторая информация, как каждый тип курсора ведет себя. Стандартный курсор хранит набор результатов в клиенте. Таким образом, я предполагаю, что существуют издержки, если Вы не получаете все строки результата, потому что даже строки, которые Вы не выбираете, должны быть переданы клиенту (потенциально по сети). Мое предположение то, что не то, чтобы отличающееся от postgresql.

, Когда Вы хотите оптимизировать SQL-операторы, которые Вы неоднократно называете со многими значениями, необходимо посмотреть на cursor.executemany (). Это готовит SQL-оператор так, чтобы это не должно было быть проанализировано каждый раз, когда Вы называете его:

cur.executemany('INSERT INTO mytable (col1, col2) VALUES (%s, %s)',
                [('val1', 1), ('val2', 2)])
1
ответ дан 14 October 2019 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: