Opened 16 years ago
Last modified 16 years ago
#8573 closed
inspectdb doesn't make use of FK information when the column name has upper case characters — at Initial Version
Reported by: | Ramiro Morales | Owned by: | nobody |
---|---|---|---|
Component: | django-admin.py inspectdb | Version: | dev |
Severity: | Keywords: | ||
Cc: | Triage Stage: | Unreviewed | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
This was reported as an issue in the django-pyodbc project but after some debugging turned to be a bug in inspectdb
.
Problem is it doesn't use the real database column name but rather a derived attname
value (used to represent the final Django model field name) when looking up the meta information about FK and indexes the DB backend provides via the DatabaseIntrospection.get_relations()
method. This fails for database engines that are case sensitive (i.e. all but Oracle).
Also, because a related problem, it can attempt to use that same attname
instead of the real table column in the db_column
field option.
Example:
This models.py
file:
class Magazine(models.Model): ident = models.AutoField(primary_key=True, db_column='Ident') class ReaderComment(models.Model): text = models.TextField(max_length=30, primary_key=True, db_column='reader_comment')
when syncdb
ed to the database (sqlite3) and the introspected back gives:
class IntrosBugMagazine(models.Model): ident = models.IntegerField() class Meta: db_table = u'intros_bug_magazine' class IntrosBugReadercomment(models.Model): reader_comment = models.TextField(primary_key=True) class Meta: db_table = u'intros_bug_readercomment'
Note the ident
field of the Magazine
model is missing 'primary_key=True'
and db_column='Ident'
options, that's because the syncdb
command didn't make use of the 'primary_key': True
info the database backend introspection support code correctly returned for it.