Django

Code

Ticket #2519: sqlite3.patch

File sqlite3.patch, 4.2 kB (added by Victor Ng <victor.ng@monkeybeanonline.com>, 2 years ago)

Update to sqlite3 driver to make it more like psycopg2

  • django/db/backends/sqlite3/base.py

    old new  
    1818Database.register_converter("timestamp", util.typecast_timestamp) 
    1919Database.register_converter("TIMESTAMP", util.typecast_timestamp) 
    2020 
     21try: 
     22    #  this only exists in 2.4+ 
     23    from decimal import Decimal 
     24    Database.register_converter("numeric", util.typecast_numeric) 
     25    Database.register_adapter(Decimal, util.rev_typecast_decimal) 
     26except: 
     27    pass 
     28 
     29import re 
     30 
     31# We need to trap any queries with empty parenthesis because their invalid in 
     32# other database - like Postgresql 
     33empty_in_clause = re.compile(".* +in +\( *\).*", re.I) 
     34 
    2135def utf8rowFactory(cursor, row): 
    2236    def utf8(s): 
    2337        if type(s) == unicode: 
     
    6680            self.connection.close() 
    6781            self.connection = None 
    6882 
    69 class SQLiteCursorWrapper(Database.Cursor): 
     83class SQLiteCursorWrapper(object): 
    7084    """ 
    7185    Django uses "format" style placeholders, but pysqlite2 uses "qmark" style. 
    7286    This fixes it -- but note that if you want to use a literal "%s" in a query, 
    7387    you'll need to use "%%s". 
    7488    """ 
     89    def __init__(self, *args, **kwargs): 
     90        self._cursor = Database.Cursor(*args, **kwargs) 
     91 
    7592    def execute(self, query, params=()): 
    7693        query = self.convert_query(query, len(params)) 
    77         return Database.Cursor.execute(self, query, params) 
     94        if empty_in_clause.match(query): 
     95            raise SyntaxError, "Invalid SQL query.  Your IN clause is empty. [%s]" % query 
     96        return self._cursor.execute(query, params) 
    7897 
    7998    def executemany(self, query, param_list): 
    8099        query = self.convert_query(query, len(param_list[0])) 
    81         return Database.Cursor.executemany(self, query, param_list) 
     100        return self._cursor.executemany(query, param_list) 
    82101 
    83102    def convert_query(self, query, num_params): 
    84103        return query % tuple("?" * num_params) 
    85104 
     105    def __getattr__(self, attr): 
     106        if self.__dict__.has_key(attr): 
     107            return self.__dict__[key] 
     108        else: 
     109            return getattr(self._cursor, attr) 
     110 
    86111supports_constraints = False 
    87112 
    88113def quote_name(name): 
  • django/db/backends/sqlite3/creation.py

    old new  
    44DATA_TYPES = { 
    55    'AutoField':                    'integer', 
    66    'BooleanField':                 'bool', 
    7     'CharField':                    'varchar(%(maxlength)s)', 
    8     'CommaSeparatedIntegerField':   'varchar(%(maxlength)s)', 
     7    'CharField':                    'varchar', 
     8    'CommaSeparatedIntegerField':   'varchar', 
    99    'DateField':                    'date', 
    1010    'DateTimeField':                'datetime', 
    11     'FileField':                    'varchar(100)', 
    12     'FilePathField':                'varchar(100)', 
    13     'FloatField':                   'numeric(%(max_digits)s, %(decimal_places)s)', 
    14     'ImageField':                   'varchar(100)', 
     11    'FileField':                    'varchar', 
     12    'FilePathField':                'varchar', 
     13    'FloatField':                   'numeric', 
     14    'ImageField':                   'varchar', 
    1515    'IntegerField':                 'integer', 
    16     'IPAddressField':               'char(15)', 
     16    'IPAddressField':               'varchar', 
    1717    'ManyToManyField':              None, 
    1818    'NullBooleanField':             'bool', 
    1919    'OneToOneField':                'integer', 
    20     'PhoneNumberField':             'varchar(20)', 
     20    'PhoneNumberField':             'varchar', 
    2121    'PositiveIntegerField':         'integer unsigned', 
    2222    'PositiveSmallIntegerField':    'smallint unsigned', 
    23     'SlugField':                    'varchar(%(maxlength)s)', 
     23    'SlugField':                    'varchar', 
    2424    'SmallIntegerField':            'smallint', 
    2525    'TextField':                    'text', 
    2626    'TimeField':                    'time', 
    27     'URLField':                     'varchar(200)', 
    28     'USStateField':                 'varchar(2)', 
     27    'URLField':                     'varchar', 
     28    'USStateField':                 'varchar', 
    2929}