Made get_table_description also return the size of char fields on SQLite

This commit is contained in:
Claude Paroz 2012-08-30 19:36:05 +02:00
parent 879b245baa
commit a9a773ff38
2 changed files with 15 additions and 7 deletions

View File

@ -45,7 +45,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
WHERE table_name = %s""", [table_name]) WHERE table_name = %s""", [table_name])
null_map = dict(cursor.fetchall()) null_map = dict(cursor.fetchall())
cursor.execute("SELECT * FROM %s LIMIT 1" % self.connection.ops.quote_name(table_name)) cursor.execute("SELECT * FROM %s LIMIT 1" % self.connection.ops.quote_name(table_name))
return [tuple([item for item in line[:6]] + [null_map[line[0]]=='YES']) return [line[:6] + (null_map[line[0]]=='YES',)
for line in cursor.description] for line in cursor.description]
def get_relations(self, cursor, table_name): def get_relations(self, cursor, table_name):

View File

@ -1,6 +1,14 @@
import re import re
from django.db.backends import BaseDatabaseIntrospection from django.db.backends import BaseDatabaseIntrospection
field_size_re = re.compile(r'^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$')
def get_field_size(name):
""" Extract the size number from a "varchar(11)" type name """
m = field_size_re.search(name)
return int(m.group(1)) if m else None
# This light wrapper "fakes" a dictionary interface, because some SQLite data # This light wrapper "fakes" a dictionary interface, because some SQLite data
# types include variables in them -- e.g. "varchar(30)" -- and can't be matched # types include variables in them -- e.g. "varchar(30)" -- and can't be matched
# as a simple dictionary lookup. # as a simple dictionary lookup.
@ -32,10 +40,9 @@ class FlexibleFieldLookupDict(object):
try: try:
return self.base_data_types_reverse[key] return self.base_data_types_reverse[key]
except KeyError: except KeyError:
import re size = get_field_size(key)
m = re.search(r'^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$', key) if size is not None:
if m: return ('CharField', {'max_length': size})
return ('CharField', {'max_length': int(m.group(1))})
raise KeyError raise KeyError
class DatabaseIntrospection(BaseDatabaseIntrospection): class DatabaseIntrospection(BaseDatabaseIntrospection):
@ -53,7 +60,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
def get_table_description(self, cursor, table_name): def get_table_description(self, cursor, table_name):
"Returns a description of the table, with the DB-API cursor.description interface." "Returns a description of the table, with the DB-API cursor.description interface."
return [(info['name'], info['type'], None, None, None, None, return [(info['name'], info['type'], None, info['size'], None, None,
info['null_ok']) for info in self._table_info(cursor, table_name)] info['null_ok']) for info in self._table_info(cursor, table_name)]
def get_relations(self, cursor, table_name): def get_relations(self, cursor, table_name):
@ -171,6 +178,7 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
# cid, name, type, notnull, dflt_value, pk # cid, name, type, notnull, dflt_value, pk
return [{'name': field[1], return [{'name': field[1],
'type': field[2], 'type': field[2],
'size': get_field_size(field[2]),
'null_ok': not field[3], 'null_ok': not field[3],
'pk': field[5] # undocumented 'pk': field[5] # undocumented
} for field in cursor.fetchall()] } for field in cursor.fetchall()]