Я хотел бы хранить объекты Python в базу данных SQLite. Это возможно?
Раз так, каковы были бы некоторые ссылки / примеры для него?
Вы не можете хранить себе объект в БД. Что вы делаете, это хранить данные от объекта и реконструировать ее позже.
Хороший способ - использовать превосходную библиотеку 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
Так что вы эффективно храняте свой объект в базу данных, лучший способ.
Да возможно, но есть разные подходы, а какие подходящие, будут зависеть от ваших требований.
Маринований
Вы можете использовать модуль модуль для сериализации объектов, затем хранить эти объекты в BLOB в SQLite3 (или текстовом поле, если дамп - это E.g. Base64 кодируется). Будьте в курсе некоторых возможных проблем: Вопросы / 198692 / Can-I-Pickle-A-Python-Dictionary-in-A-SQLite3-Text-Text-Field
Объектно-реляционное отображение
Вы можете использовать объект реляционное отображение. Это создает, по существу, «база данных виртуальной объекты», которая может использоваться из языка программирования ( Wikipedia ). Для Python есть хороший инструментарий для этого: SQLALCHEMY .
Вы другой выбор вместо кровообращения состоит в том, чтобы использовать ORM . Это позволяет отображать строки в базе данных на объект. Смотри http://wiki.python.org/moin/higherleveldatabaseprogramming для отправной точки. Я бы порекомендовал SQLALCHEMY или SQLOBJECT .
Вы можете использовать сортировку для сериализации объекта. Сериализованный объект может быть вставлен в SQLite DB в виде поля ByTearray.
f=open('object.dump', 'rw')
pickle.dump(obj, f)
Теперь прочитайте Object.dump
из файла и запишите его в SQLite DB. Вы можете захотеть написать его как бинарный тип данных; Читайте о хранении двоичных данных и BLOB в SQLite здесь . Обратите внимание, что согласно этот источник , SQLite ограничивает размер такого данных Datafield до 1 МБ.
Я думаю, что лучший вариант будет сериализовать ваш объект в файл и сохранить имя имя , а не содержимое в базе данных.
Одним из вариантов является использование O/R mapper типа SQLObject. Он сделает большую часть водопровода, чтобы сохранить объект Python в базе данных, и он поддерживает SQLite. Как уже упоминалось, вы также можете сериализовать объект, используя такой метод, как pickle, который вытаскивает изображение объекта, которое он может реконструировать, читая его обратно и разбирая.
Вы можете использовать маринованный огурчик. dumps, его возвращаемые пикируемые объекты в виде строк, вам не нужно будет записывать его во временные файлы.
Return the pickled representation of объект в виде строки , вместо записывая его в файл.
import pickle
class Foo:
attr = 'a class attr'
picklestring = pickle.dumps(Foo)