def extract_condition_keys(self): if len(self.conditions): conditions = [] for k in self.conditions: if isinstance(self.conditions[k], list): conditions.append("%s IN %s" % (escape(k), "(%s)" % str(self.conditions[k])[1:-1])) else: conditions.append("%s=%s" % (escape(k), self.db.conn.placeholder)) return 'WHERE %s' % ' AND '.join(conditions)
def _update(self): "Uses SQL UPDATE to update record" query = "UPDATE %s SET " % self.Meta.table_safe query += ", ".join(["%s = %s" % (escape(f), self.db.conn.placeholder) for f in self._changed]) query += " WHERE %s = %s " % (escape(self.Meta.pk), self.db.conn.placeholder) values = [getattr(self, f) for f in self._changed] values.append(self._get_pk()) cursor = Query.raw_sql(query, values, self.db)
def _update(self): 'Uses SQL UPDATE to update record' query = 'UPDATE %s SET ' % self.Meta.table_safe query += ', '.join([ '%s = %s' % (escape(f), self.db.conn.placeholder) for f in self._changed ]) query += ' WHERE %s = %s ' % (escape( self.Meta.pk), self.db.conn.placeholder) values = [getattr(self, f) for f in self._changed] values.append(self._get_pk()) cursor = Query.raw_sql(query, values, self.db)
def extract_condition_keys(self): if len(self.conditions): return 'WHERE %s' % ' AND '.join( "%s%s%s" % (escape(k.split(' ')[0]), (k.split(' ')[1] if len(k.split(' ')) > 1 else '='), self.db.conn.placeholder) for k in self.conditions)
def __new__(cls, name, bases, attrs): if name == "Model": return super(ModelBase, cls).__new__(cls, name, bases, attrs) new_class = type.__new__(cls, name, bases, attrs) if not getattr(new_class, "Meta", None): new_class.Meta = Empty if not getattr(new_class.Meta, "table", None): new_class.Meta.table = name.lower() new_class.Meta.table_safe = escape(new_class.Meta.table) # Assume id is the default if not getattr(new_class.Meta, "pk", None): new_class.Meta.pk = "id" # Create function to loop over iterable validations for k, v in getattr(new_class.Meta, "validations", {}).iteritems(): if isinstance(v, (list, tuple)): new_class.Meta.validations[k] = ValidatorChain(*v) # See cursor.description # http://www.python.org/dev/peps/pep-0249/ if not hasattr(new_class, "db"): new_class.db = autumn_db db = new_class.db q = Query.raw_sql("SELECT * FROM %s LIMIT 1" % new_class.Meta.table_safe, db=new_class.db) new_class._fields = [f[0] for f in q.description] cache.add(new_class) return new_class
def __new__(cls, name, bases, attrs): if name == 'Model': return super(ModelBase, cls).__new__(cls, name, bases, attrs) new_class = type.__new__(cls, name, bases, attrs) if not getattr(new_class, 'Meta', None): new_class.Meta = Empty if not getattr(new_class.Meta, 'table', None): new_class.Meta.table = name.lower() new_class.Meta.table_safe = escape(new_class.Meta.table) # Assume id is the default if not getattr(new_class.Meta, 'pk', None): new_class.Meta.pk = 'id' # Create function to loop over iterable validations for k, v in getattr(new_class.Meta, 'validations', {}).iteritems(): if isinstance(v, (list, tuple)): new_class.Meta.validations[k] = ValidatorChain(*v) # See cursor.description # http://www.python.org/dev/peps/pep-0249/ if not hasattr(new_class, "db"): new_class.db = autumn_db db = new_class.db q = Query.raw_sql('SELECT * FROM %s LIMIT 1' % new_class.Meta.table_safe, db=new_class.db) new_class._fields = [f[0] for f in q.description] cache.add(new_class) return new_class
def order_by(self, field, direction='ASC'): field = field.split(',') escaped_fields = "" for f in field: if escaped_fields: escaped_fields += "," escaped_fields += escape(f) self.order = 'ORDER BY %s %s' % (escaped_fields, direction) return self
def _new_save(self): "Uses SQL INSERT to create new record" # if pk field is set, we want to insert it too # if pk field is None, we want to auto-create it from lastrowid auto_pk = 1 and (self._get_pk() is None) or 0 fields = [escape(f) for f in self._fields if f != self.Meta.pk or not auto_pk] query = "INSERT INTO %s (%s) VALUES (%s)" % ( self.Meta.table_safe, ", ".join(fields), ", ".join([self.db.conn.placeholder] * len(fields)), ) values = [getattr(self, f, None) for f in self._fields if f != self.Meta.pk or not auto_pk] cursor = Query.raw_sql(query, values, self.db) if self._get_pk() is None: self._set_pk(cursor.lastrowid) return True
def __new__(cls, name, bases, attrs): def __pluralize(name): return name + 's' def __to_table(name): table = name[0].lower() for i in range(len(name)-1): if name[i+1].isupper(): table += '_' table += name[i+1].lower() return table if name == 'Model': return super(ModelBase, cls).__new__(cls, name, bases, attrs) new_class = type.__new__(cls, name, bases, attrs) if not getattr(new_class, 'Meta', None): new_class.Meta = Empty new_class.Meta.raw_name = __to_table(name) if not getattr(new_class.Meta, 'table', None): new_class.Meta.table = __pluralize(new_class.Meta.raw_name) new_class.Meta.table_safe = escape(new_class.Meta.table) # Assume id is the default if not getattr(new_class.Meta, 'pk', None): new_class.Meta.pk = 'id' # Create function to loop over iterable validations for k, v in getattr(new_class.Meta, 'validations', {}).iteritems(): if isinstance(v, (list, tuple)): new_class.Meta.validations[k] = ValidatorChain(*v) # See cursor.description # http://www.python.org/dev/peps/pep-0249/ if not hasattr(new_class, "db"): new_class.db = autumn_db db = new_class.db q = Query.raw_sql('SELECT * FROM %s LIMIT 1' % new_class.Meta.table_safe, db=new_class.db) new_class._fields = [f[0] for f in q.description] cache.add(new_class) return new_class
def _new_save(self): 'Uses SQL INSERT to create new record' # if pk field is set, we want to insert it too # if pk field is None, we want to auto-create it from lastrowid auto_pk = 1 and (self._get_pk() is None) or 0 fields = [ escape(f) for f in self._fields if f != self.Meta.pk or not auto_pk ] query = 'INSERT INTO %s (%s) VALUES (%s)' % ( self.Meta.table_safe, ', '.join(fields), ', '.join( [self.db.conn.placeholder] * len(fields))) values = [ getattr(self, f, None) for f in self._fields if f != self.Meta.pk or not auto_pk ] cursor = Query.raw_sql(query, values, self.db) if self._get_pk() is None: self._set_pk(cursor.lastrowid) return True
def extract_condition_keys(self): if len(self.conditions): return "WHERE %s" % " AND ".join("%s=%s" % (escape(k), self.db.conn.placeholder) for k in self.conditions)
def order_by(self, field, direction="ASC"): self.order = "ORDER BY %s %s" % (escape(field), direction) return self
def order_by(self, field, direction='ASC'): self.order = 'ORDER BY %s %s' % (escape(field), direction) return self
def extract_condition_keys(self): if len(self.conditions): return 'WHERE %s' % ' AND '.join( "%s=%s" % (escape(k), self.db.conn.placeholder) for k in self.conditions)
def extract_condition_keys(self): if len(self.conditions): return 'WHERE %s' % ' AND '.join("%s%s%s" % (escape(k.split(' ')[0]), (k.split(' ')[1] if len(k.split(' ')) > 1 else '='), self.db.conn.placeholder) for k in self.conditions)
def testmodel(self): # Create tables ### MYSQL ### # # DROP TABLE IF EXISTS author; # CREATE TABLE author ( # id INT(11) NOT NULL auto_increment, # first_name VARCHAR(40) NOT NULL, # last_name VARCHAR(40) NOT NULL, # bio TEXT, # PRIMARY KEY (id) # ); # DROP TABLE IF EXISTS books; # CREATE TABLE books ( # id INT(11) NOT NULL auto_increment, # title VARCHAR(255), # author_id INT(11), # FOREIGN KEY (author_id) REFERENCES author(id), # PRIMARY KEY (id) # ); ### SQLITE ### # # DROP TABLE IF EXISTS author; # DROP TABLE IF EXISTS books; # CREATE TABLE author ( # id INTEGER PRIMARY KEY AUTOINCREMENT, # first_name VARCHAR(40) NOT NULL, # last_name VARCHAR(40) NOT NULL, # bio TEXT # ); # CREATE TABLE books ( # id INTEGER PRIMARY KEY AUTOINCREMENT, # title VARCHAR(255), # author_id INT(11), # FOREIGN KEY (author_id) REFERENCES author(id) # ); for table in ("author", "books"): Query.raw_sql("DELETE FROM %s" % escape(table)) # Test Creation james = Author(first_name="James", last_name="Joyce") james.save() kurt = Author(first_name="Kurt", last_name="Vonnegut") kurt.save() tom = Author(first_name="Tom", last_name="Robbins") tom.save() Book(title="Ulysses", author_id=james.id).save() Book(title="Slaughter-House Five", author_id=kurt.id).save() Book(title="Jitterbug Perfume", author_id=tom.id).save() slww = Book(title="Still Life with Woodpecker", author_id=tom.id) slww.save() # Test ForeignKey self.assertEqual(slww.author.first_name, "Tom") # Test OneToMany self.assertEqual(len(list(tom.books)), 2) kid = kurt.id del (james, kurt, tom, slww) # Test retrieval b = Book.get(title="Ulysses")[0] a = Author.get(id=b.author_id)[0] self.assertEqual(a.id, b.author_id) a = Author.get(id=b.id)[:] self.assert_(isinstance(a, list)) # Test update new_last_name = "Vonnegut, Jr." a = Author.get(id=kid)[0] a.last_name = new_last_name a.save() a = Author.get(kid) self.assertEqual(a.last_name, new_last_name) # Test count self.assertEqual(Author.get().count(), 3) self.assertEqual(len(Book.get()[1:4]), 3) # Test delete a.delete() self.assertEqual(Author.get().count(), 2) # Test validation a = Author(first_name="", last_name="Ted") try: a.save() raise Exception("Validation not caught") except Model.ValidationError: pass # Test defaults a.first_name = "Bill and" a.save() self.assertEqual(a.bio, "No bio available") try: Author(first_name="I am a", last_name="BadGuy!").save() raise Exception("Validation not caught") except Model.ValidationError: pass
def testmodel(self): # Create tables ### MYSQL ### # # DROP TABLE IF EXISTS author; # CREATE TABLE author ( # id INT(11) NOT NULL auto_increment, # first_name VARCHAR(40) NOT NULL, # last_name VARCHAR(40) NOT NULL, # bio TEXT, # PRIMARY KEY (id) # ); # DROP TABLE IF EXISTS books; # CREATE TABLE books ( # id INT(11) NOT NULL auto_increment, # title VARCHAR(255), # author_id INT(11), # FOREIGN KEY (author_id) REFERENCES author(id), # PRIMARY KEY (id) # ); ### SQLITE ### # # DROP TABLE IF EXISTS author; # DROP TABLE IF EXISTS books; # CREATE TABLE author ( # id INTEGER PRIMARY KEY AUTOINCREMENT, # first_name VARCHAR(40) NOT NULL, # last_name VARCHAR(40) NOT NULL, # bio TEXT # ); # CREATE TABLE books ( # id INTEGER PRIMARY KEY AUTOINCREMENT, # title VARCHAR(255), # author_id INT(11), # FOREIGN KEY (author_id) REFERENCES author(id) # ); for table in ('author', 'books'): Query.raw_sql('DELETE FROM %s' % escape(table)) # Test Creation james = Author(first_name='James', last_name='Joyce') james.save() kurt = Author(first_name='Kurt', last_name='Vonnegut') kurt.save() tom = Author(first_name='Tom', last_name='Robbins') tom.save() Book(title='Ulysses', author_id=james.id).save() Book(title='Slaughter-House Five', author_id=kurt.id).save() Book(title='Jitterbug Perfume', author_id=tom.id).save() slww = Book(title='Still Life with Woodpecker', author_id=tom.id) slww.save() # Test ForeignKey self.assertEqual(slww.author.first_name, 'Tom') # Test OneToMany self.assertEqual(len(list(tom.books)), 2) kid = kurt.id del (james, kurt, tom, slww) # Test retrieval b = Book.get(title='Ulysses')[0] a = Author.get(id=b.author_id)[0] self.assertEqual(a.id, b.author_id) a = Author.get(id=b.id)[:] self.assert_(isinstance(a, list)) # Test update new_last_name = 'Vonnegut, Jr.' a = Author.get(id=kid)[0] a.last_name = new_last_name a.save() a = Author.get(kid) self.assertEqual(a.last_name, new_last_name) # Test count self.assertEqual(Author.get().count(), 3) self.assertEqual(len(Book.get()[1:4]), 3) # Test delete a.delete() self.assertEqual(Author.get().count(), 2) # Test validation a = Author(first_name='', last_name='Ted') try: a.save() raise Exception('Validation not caught') except Model.ValidationError: pass # Test defaults a.first_name = 'Bill and' a.save() self.assertEqual(a.bio, 'No bio available') try: Author(first_name='I am a', last_name='BadGuy!').save() raise Exception('Validation not caught') except Model.ValidationError: pass