2009-10-05 14 views

Odpowiedz

9

Musisz serializować listę (lub inny obiekt Pythona) do ciągu bajtów, zwanego również "BLOB" ;-), za pomocą swoich ulubionych środków (marshal jest dobre dla list wartości elementarnych, takich jak liczby lub ciągi znaków & c, cPickle jeśli chcesz bardzo ogólne rozwiązanie, itp.) I deserializować go po jego pobraniu. Oczywiście, że w zasadzie prowadzi listę (lub inny obiekt Pythona) jako bierny „ładunek” - nie można sensownie wykorzystać w WHERE klauzulami, ORDER BY itp

Relacyjne bazy danych po prostu nie radzą sobie zbyt dobrze z wartościami nieatomowymi i wolałby inne, znormalizowane alternatywy (przechowuj pozycje listy w innej tabeli, która zawiera kolumnę "identyfikator_pliku", wstaw "identyfikator_pliku" w głównej tabeli, itd.). Nie-relacyjne bazy danych, chociaż mają zwykle ograniczenia relacyjne (np. Brak sprzężeń), mogą oferować bardziej bezpośrednie wsparcie dla twoich wymagań.

Niektóre relacyjne bazy danych mają nierelacyjne rozszerzenia. Na przykład PostGreSQL obsługuje typ danych array (nie tak ogólny, jak listy Pythona - tablice PgSQL są wewnętrznie jednorodne).

+0

dzięki.Myślę, że przeprojektuję moją bazę danych, aby mieć oddzielną tabelę, ponieważ potrzebuję móc użyć wartości w klauzuli "WHERE". – john2x

8

Zasadniczo robi się to poprzez uszeregowanie listy (za pomocą repr()), a następnie zapisanie ciągu znaków. Po odczytaniu łańcucha z bazy danych użyj eval(), aby ponownie utworzyć listę. Zachowaj ostrożność, chociaż masz pewność, że żadne dane generowane przez użytkowników nie trafią do kolumny lub eval() jest zagrożeniem bezpieczeństwa.

3

Twoje pytanie jest trudne do zrozumienia. Tutaj znowu:

Chcę, aby 3 kolumny miały 9 różnych wartości, takich jak lista w Pythonie. Czy to możliwe? Jeśli nie w SQLite, to w innym silniku bazy danych?

Oto, co moim zdaniem zadajesz: czy możliwe jest pobranie listy 9 różnych wartości w Pythonie i zapisanie wartości pod konkretną kolumną w bazie danych?

Odpowiedź na to pytanie brzmi "tak". Proponuję użyć biblioteki Python ORM zamiast próbować samodzielnie napisać kod SQL. Ten przykładowy kod wykorzystuje Autumn:

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 

uruchomić ten kod, a następnie zamknąć i uruchomić Pythona sqlite3 my_test.db. Następnie należy uruchomić polecenie SQL wewnątrz SQLite: select * from mytest; Oto wynik:

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

Przykład ten ciągnie wartości z jednej listy i używa wartości, aby wypełnić jedną kolumnę z bazy danych. Można go trywialnie rozszerzyć, dodając dodatkowe kolumny i wypełniając je również.

Jeśli nie jest to odpowiedź, której szukasz, proszę ponownie sformułować swoją prośbę w celu wyjaśnienia.

P.S. W tym przykładzie użyto autumn.util. Numer setup.py dołączony do aktualnej wersji Jesieni nie instaluje się w odpowiednim miejscu na util.py; będziesz musiał ukończyć konfigurację jesieni ręcznie.

Można użyć bardziej dojrzałej metody ORM, takiej jak SQLAlchemy lub ORM z Django. Jednak naprawdę lubię jesień, szczególnie w przypadku SQLite.

Powiązane problemy