Ticket #2519: sqlite3.patch

File sqlite3.patch, 4.2 KB (added by Victor Ng <victor.ng@…>, 9 years ago)

Update to sqlite3 driver to make it more like psycopg2

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

     
    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

     
    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}
Back to Top