Действительно ли возможно сохранить список значений в столбец SQLite?

Вот простой реальный пример.

Несколько лет назад, мой босс заявляет, "Функция XYZ раньше работала, и теперь она не делает. Никто не знает то, что произошло. Можно ли зафиксировать его?"

Теперь я никогда не работал с функцией XYZ прежде. Так фиксация его включила бы большое верчение вокруг попытки выяснить то, что это делает.

, Но у нас есть управление исходным кодом! Таким образом, я делаю это:

  • Создают сценарий тестирования для тестирования функции XYZ: "Щелкните здесь, введите это, нажмите там, и т.д."
  • Получают текущую версию. Сборка. Тест. Функция XYZ повреждается.
  • Получают версию от неделю назад. Сборка. Тест. Функция работы XYZ.
  • Получают версию на полпути между теми двумя. Сборка. Тест. Функция работы XYZ.
  • Получают версию на полпути между предыдущей и текущей. Сборка. Тест. Функция XYZ повреждается.

я продолжал делать этот двоичный поиск до в конечном счете, я поразил точку изменения: версия 145 (мы скажем), имел работу функции, но версии 146 повредили ее. Затем я просто сделал сравнивание между теми двумя версиями для наблюдения то, что изменилось. Оказывается, что наш технический руководитель ( вздох ) зарегистрировался в коде, который изменил функциональность, но также и представил побочный эффект, который повредил функцию XYZ.

, Таким образом, я удалил побочный эффект, протестированный... и о чудо, функция XYZ работала снова.

Без [1 114] управление исходным кодом, Вы никогда не можете делать этого. Необходимо будет крутиться вокруг, изменяя одну вещь или другого, надеясь волшебно совершить нападки на вещи, которая заставляет функцию XYZ работать снова.

С [1 115] управление исходным кодом, Вы просто тестируете свой путь через версии, точно определяете точный код, который вызвал проблему, и зафиксируйте его.

8
задан john2x 4 October 2009 в 13:26
поделиться

3 ответа

Вы должны сериализовать список (или другой объект Python) в строку байтов, также известную как «BLOB» ;-), используя ваши любимые средства ( marshal подходит для списки элементарных значений, таких как числа или строки & c, cPickle , если вам нужно очень общее решение и т. д.), и десериализуйте его, когда вы получите его обратно. Конечно, он в основном несет список (или другой объект Python) как пассивную «полезную нагрузку» - не может значимо использовать его в предложениях WHERE , ORDER BY и т. Д.

Реляционные базы данных просто не очень хорошо справляются с неатомарными значениями и предпочли бы другие, нормализованные альтернативы (сохраните элементы списка в другой таблице, которая включает столбец «listID», поместите «listID» в свою основную таблицу. , так далее). Нереляционные базы данных, хотя они обычно имеют ограничения по отношению к реляционным (например, отсутствие объединений), могут предложить более прямую поддержку для ваших требований.

Некоторые реляционные БД действительно имеют нереляционные расширения. Например, PostGreSQL поддерживает тип данных array (не такой общий, как списки Python - массивы PgSQL по своей сути однородны).

14
ответ дан 3 November 2019 в 14:19
поделиться

Обычно это делается путем преобразования списка в строку (с помощью repr ()), а затем сохранения строки. При чтении строки из базы данных используйте eval (), чтобы заново создать список. Будьте осторожны, хотя вы уверены, что никакие данные, созданные пользователем, не могут попасть в столбец, или eval () представляет угрозу безопасности.

10
ответ дан 3 November 2019 в 14:19
поделиться

Ваш вопрос сложен для понимания. И снова:

Я хочу, чтобы 3 столбца имели 9 различных значений, как список в Python. Является ли это возможным? Если не в SQLite, то на другом движке базы данных?

Думаю, вы спрашиваете вот что: можно ли взять список Python из 9 различных значений и сохранить значения в определенном столбце базы данных?

] Ответ на этот вопрос - «да». Я предлагаю использовать библиотеку Python ORM вместо того, чтобы пытаться написать код SQL самостоятельно. В этом примере кода используется Осень :

import autumn
import autumn.util
from autumn.util import create_table

# get a database connection object
my_test_db = autumn.util.AutoConn("my_test.db")


# code to create the database table
_create_sql = """\
DROP TABLE IF EXISTS mytest;
CREATE TABLE mytest (
   id INTEGER PRIMARY KEY AUTOINCREMENT,
   value INTEGER NOT NULL,
   UNIQUE(value)
);"""

# create the table, dropping any previous table of same name
create_table(my_test_db, _create_sql)

# create ORM class; Autumn introspects the database to find out columns
class MyTest(autumn.model.Model):
    db = my_test_db


lst = [3, 6, 9, 2, 4, 8, 1, 5, 7]  # list of 9 unique values

for n in lst:
    row = MyTest(value=n)  # create MyTest() row instance with value initialized
    row.save()  # write the data to the database

Запустите этот код, затем выйдите из Python и запустите sqlite3 my_test.db . Затем запустите эту команду SQL внутри SQLite: select * from mytest; Вот результат:

1|3
2|6
3|9
4|2
5|4
6|8
7|1
8|5
9|7

В этом примере извлекаются значения из одного списка и используются значения для заполнения одного столбца из базы данных. Его можно тривиально расширить, чтобы добавить дополнительные столбцы и заполнить их.

Если это не тот ответ, который вы ищете, перефразируйте свой запрос, чтобы уточнить.

PS В этом примере используется autumn.util . setup.py , включенный в текущий выпуск Autumn, не устанавливает util.py в нужное место; вам нужно будет завершить настройку Autumn вручную.

Вы можете использовать более зрелую ORM, такую ​​как SQLAlchemy или ORM от Django. Однако мне очень нравится осень, особенно для SQLite.

py , включенный в текущий выпуск Autumn, не устанавливает util.py в правильное место; вам нужно будет завершить настройку Autumn вручную.

Вы можете использовать более зрелую ORM, такую ​​как SQLAlchemy или ORM от Django. Однако мне очень нравится осень, особенно для SQLite.

py , включенный в текущий выпуск Autumn, не устанавливает util.py в правильное место; вам нужно будет завершить настройку Autumn вручную.

Вы можете использовать более зрелую ORM, такую ​​как SQLAlchemy или ORM от Django. Однако мне очень нравится осень, особенно для SQLite.

3
ответ дан 3 November 2019 в 14:19
поделиться
Другие вопросы по тегам:

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