Можно ли сохранить список значений в столбце SQLite? - PullRequest
7 голосов
/ 05 октября 2009

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

Ответы [ 3 ]

13 голосов
/ 05 октября 2009

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

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

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

10 голосов
/ 05 октября 2009

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

3 голосов
/ 05 октября 2009

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

Я хочу, чтобы 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

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

Если это не тот ответ, который вы ищете, пожалуйста, перефразируйте ваш запрос для уточнения.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...