Действительно ли возможно сохранить объекты класса Python в SQLite?

Я хотел бы хранить объекты Python в базу данных SQLite. Это возможно?

Раз так, каковы были бы некоторые ссылки / примеры для него?

34
задан Peter Mortensen 14 January 2010 в 00:11
поделиться

6 ответов

Вы не можете хранить себе объект в БД. Что вы делаете, это хранить данные от объекта и реконструировать ее позже.

Хороший способ - использовать превосходную библиотеку SQLAlchemy . Он позволяет отображать ваш определенный класс в таблицу в базе данных. Каждый сопоставленный атрибут будет храниться и может быть использован для восстановления объекта. Запрос базы данных возвращает экземпляры вашего класса.

С этим вы можете использовать не только SQLite, но большинство баз данных - в настоящее время он также поддерживает Postgres, MySQL, Oracle, MS-SQL, Firebird, MaxDB, MS Access, Sybase, Informix и IBM DB2. И вы можете выбрать свой пользователь, что она хочет использовать, потому что вы можете в основном переключаться между этими базами данных без изменения кода вообще.

Есть также много крутых функций - как автоматический присоединиться S, полиморфринг ...

Быстрый, простой пример, который вы можете запустить:

from sqlalchemy import Column, Integer, Unicode, UnicodeText, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

from random import choice
from string import letters

engine = create_engine('sqlite:////tmp/teste.db', echo=True)
Base = declarative_base(bind=engine)

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(40))
    address = Column(UnicodeText, nullable=True)
    password = Column(String(20))

    def __init__(self, name, address=None, password=None):
        self.name = name
        self.address = address
        if password is None:
            password = ''.join(choice(letters) for n in xrange(10))
        self.password = password

Base.metadata.create_all()

Session = sessionmaker(bind=engine)
s = Session()

, то я могу использовать это так:

# create instances of my user object
u = User('nosklo')
u.address = '66 Some Street #500'

u2 = User('lakshmipathi')
u2.password = 'ihtapimhskal'

# testing
s.add_all([u, u2])
s.commit()

Это будет запустить вставку утверждений против базы данных.

# When you query the data back it returns instances of your class:

for user in s.query(User):
    print type(user), user.name, user.password

Этот запрос будет запущен , выберите «114064]. Выберите« Пользователи »как users_id, пользователи. Немейте как users_name, users.address как users_address, users.password как users_password .

Напечатанный результат будет:

<class '__main__.User'> nosklo aBPDXlTPJs
<class '__main__.User'> lakshmipathi ihtapimhskal

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

59
ответ дан 27 November 2019 в 16:19
поделиться

Да возможно, но есть разные подходы, а какие подходящие, будут зависеть от ваших требований.

  • Маринований

    Вы можете использовать модуль модуль для сериализации объектов, затем хранить эти объекты в BLOB в SQLite3 (или текстовом поле, если дамп - это E.g. Base64 кодируется). Будьте в курсе некоторых возможных проблем: Вопросы / 198692 / Can-I-Pickle-A-Python-Dictionary-in-A-SQLite3-Text-Text-Field

  • Объектно-реляционное отображение

    Вы можете использовать объект реляционное отображение. Это создает, по существу, «база данных виртуальной объекты», которая может использоваться из языка программирования ( Wikipedia ). Для Python есть хороший инструментарий для этого: SQLALCHEMY .

15
ответ дан 27 November 2019 в 16:19
поделиться

Вы другой выбор вместо кровообращения состоит в том, чтобы использовать ORM . Это позволяет отображать строки в базе данных на объект. Смотри http://wiki.python.org/moin/higherleveldatabaseprogramming для отправной точки. Я бы порекомендовал SQLALCHEMY или SQLOBJECT .

1
ответ дан 27 November 2019 в 16:19
поделиться

Вы можете использовать сортировку для сериализации объекта. Сериализованный объект может быть вставлен в SQLite DB в виде поля ByTearray.

f=open('object.dump', 'rw')
pickle.dump(obj, f)

Теперь прочитайте Object.dump из файла и запишите его в SQLite DB. Вы можете захотеть написать его как бинарный тип данных; Читайте о хранении двоичных данных и BLOB в SQLite здесь . Обратите внимание, что согласно этот источник , SQLite ограничивает размер такого данных Datafield до 1 МБ.

Я думаю, что лучший вариант будет сериализовать ваш объект в файл и сохранить имя имя , а не содержимое в базе данных.

1
ответ дан 27 November 2019 в 16:19
поделиться

Одним из вариантов является использование O/R mapper типа SQLObject. Он сделает большую часть водопровода, чтобы сохранить объект Python в базе данных, и он поддерживает SQLite. Как уже упоминалось, вы также можете сериализовать объект, используя такой метод, как pickle, который вытаскивает изображение объекта, которое он может реконструировать, читая его обратно и разбирая.

0
ответ дан 27 November 2019 в 16:19
поделиться

Вы можете использовать маринованный огурчик. dumps, его возвращаемые пикируемые объекты в виде строк, вам не нужно будет записывать его во временные файлы.

Return the pickled representation of объект в виде строки , вместо записывая его в файл.

import pickle

class Foo:
    attr = 'a class attr'

picklestring = pickle.dumps(Foo)
8
ответ дан 27 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

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