Utilizarea listei ca tip de date într-o coloană (SQLAlchemy) (Programare, Python, Sqlalchemy)

Chris a intrebat.

Vreau să stochez o listă de urls de feed-uri RSS într-un db sqlite. Folosesc SQLAlchemy și mă întrebam cum să stochez acestea. Se pare că nu pot găsi nicio documentație despre liste și mă întrebam dacă acest lucru este legal pentru o coloană: Column(‘rss_feed_urls’, List)

Sau există un tip de matrice pe care aș putea să o folosesc?

Comentarii

  • Dacă foloseați PostgreSQL, acesta are tipuri de matrice, pe care le-ați putea folosi în acest scop. O matrice de șiruri de caractere cu 1 dim este, în esență, o listă de șiruri de caractere. –  > Por Faheem Mitha.
4 răspunsuri
zeekay

Dacă trebuie neapărat să folosiți PickleType. Dar ceea ce doriți probabil este un alt tabel (care constă dintr-un listă de rânduri, nu-i așa?). Creați doar un tabel care să conțină fluxurile RSS:

class RssFeed(Base):
    __tablename__ = 'rssfeeds'
    id = Column(Integer, primary_key=True)
    url = Column(String)

Adăugați noi urls:

feed = RssFeed(url='http://url/for/feed')
session.add(feed)

Recuperați lista de urls:

session.query(RssFeed).all()

Găsiți un feed specific prin index:

session.query(RssFeed).get(1)

Aș recomanda SQLAlchemy’s Object Relational Tutorial.

Aruncă_excepții_la_voastră

Dacă utilizați o bază de date PostgreSQL, puteți utiliza tipul SQL Alchemy ARRAY pentru aceasta. Rețineți că este un Array tipizat.

class sqlalchemy.types.ARRAY(item_type, as_tuple=False, dimensions=None, zero_indexes=False)

Maxim Egorushkin

În mod normal, nu există nicio listă între tipurile de date ale coloanelor din bazele de date SQL.

O modalitate de a stoca o listă ca valoare de coloană este de a converti acea listă într-un șir de caractere, care ar fi mapat în tipul de date din baza de date varchar.

O altă modalitate este de a converti lista într-o reprezentare binară serializată (utilizând pickle de exemplu) și stocarea valorii ca valoare de bază de date de tip blob.

Comentarii

Amin Pial

Puteți utiliza MutableList din sqlalchemy

from sqlalchemy.ext.mutable import MutableList
from sqlalchemy impoer pickleType
import logging # not necessary, for logging purpose only

my_list_column_field = Column(MutableList.as_mutable(PickleType),
                                    default=[])

# now you can do common operations in this list. e.g:

# append to the list (just like python)
my_list_column_field = my_list_column_field + [any_data_type]

# and don't forget to commit your changes
try:
   db.commit()
except SQLAlchemyError as e:
   db.rollback()
   logging.error("Failed to Commit because of {error}. Doing Rollback".format(error=e))

Dacă utilizați pur și simplu PickleType, , nu veți putea modifica acea listă după prima inserție. Pentru a o modifica ulterior avem nevoie de MutableList. De asemenea, puteți utiliza Set, Dict în felul următor, folosind MutableSet, MutableDict.

Există totuși o altă modalitate mai puțin evidentă. Pentru a salva ca șir de caractere prin json.dumps(my_list) și apoi, în timpul recuperării, trebuie doar să faceți json.loads(my_column). Dar acest lucru vă va cere să setați datele într-un format cheie-valoare și pare puțin ineficient în comparație cu soluția anterioară.