Made get_table_description also return the size of char fields on SQLite
This commit is contained in:
parent
879b245baa
commit
a9a773ff38
|
@ -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):
|
||||||
|
|
|
@ -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()]
|
||||||
|
|
Loading…
Reference in New Issue