Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to store Python class objects in SQLite?

I would like to store Python objects into a SQLite database. Is that possible?

If so what would be some links / examples for it?

like image 458
webminal.org Avatar asked Jan 12 '10 09:01

webminal.org


2 Answers

You can't store the object itself in the DB. What you do is to store the data from the object and reconstruct it later.

A good way is to use the excellent SQLAlchemy library. It lets you map your defined class to a table in the database. Every mapped attribute will be stored, and can be used to reconstruct the object. Querying the database returns instances of your class.

With it you can use not only sqlite, but most databases - It currently also supports Postgres, MySQL, Oracle, MS-SQL, Firebird, MaxDB, MS Access, Sybase, Informix and IBM DB2. And you can have your user choose which one she wants to use, because you can basically switch between those databases without changing the code at all.

There are also a lot of cool features - like automatic JOINs, polymorphing...

A quick, simple example you can run:

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() 

Then I can use it like this:

# 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() 

That would run INSERT statements against the database.

# 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 

That query would run SELECT users.id AS users_id, users.name AS users_name, users.address AS users_address, users.password AS users_password.

The printed result would be:

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

So you're effectively storing your object into the database, the best way.

like image 142
nosklo Avatar answered Oct 05 '22 15:10

nosklo


Yes it's possible but there are different approaches and which one is the suitable one, will depend on your requirements.

  • Pickling

    You can use the pickle module to serialize objects, then store these objects in a blob in sqlite3 (or a textfield, if the dump is e.g. base64 encoded). Be aware of some possible problems: questions/198692/can-i-pickle-a-python-dictionary-into-a-sqlite3-text-field

  • Object-Relational-Mapping

    You can use object relational mapping. This creates, in effect, a "virtual object database" that can be used from within the programming language (Wikipedia). For python, there is a nice toolkit for that: sqlalchemy.

like image 37
miku Avatar answered Oct 05 '22 14:10

miku