0

I have a mysql database that was generated by doctrine/symfony1.4 and I require a separate django 1.4 project to reference existing tables on the same mysql database. The database is shared by many client facing UIs and cannot be migrated or copied, both symfony and django need to reference/update the same tables on the same database so that the client facing UIs are in sync. Unfortunately, doctrine was there first and created constraint names and index names between these tables and I can't find how to force django to use the same names. This causes crashes when I try to wrap these existing tables in django objects.

Any ideas how to overwrite or force django 1.4 models to use specific foreign key constraint names as well as indexes?

UPDATE: adding more info about the table setup and crash

doctrine schema:

Feature:
    actAs: [Timestampable]
    columns:
      name: { type: string(100) }
      description: { type: string(200) }
      pivotXpos: { type: float, notnull: true }
      pivotYpos: { type: float, notnull: true }
      referenceImageUrl: { type: string(200), notnull: true }
      referenceThumbnailImageUrl: { type: string(200), notnull: true }
      bbox_minx: { type: float, notnull: true }
      bbox_miny: { type: float, notnull: true }
      bbox_maxx: { type: float, notnull: true }
      bbox_maxy: { type: float, notnull: true }
    relations:
      Curve:
        local: id
        foreign: feature_id
        cascade: [delete]
        type: many


Curve:
    actAs: [Timestampable]
    columns:
      name: { type: string(100), notnull:true}
      feature_id: { type: bigint, notnull: true }
    relations:
      Feature: { onDelete: CASCADE, local: feature_id, foreign: id, 
               foreignAlias: Curves }

table sql

CREATE TABLE feature (id BIGINT AUTO_INCREMENT, 
name VARCHAR(100), description VARCHAR(200), 
pivotxpos FLOAT(18, 2) NOT NULL, 
pivotypos FLOAT(18, 2) NOT NULL,
referenceimageurl VARCHAR(200) NOT NULL,
referencethumbnailimageurl VARCHAR(200) NOT NULL, 
bbox_minx FLOAT(18, 2) NOT NULL, 
bbox_miny FLOAT(18, 2) NOT NULL, 
bbox_maxx FLOAT(18, 2) NOT NULL, 
bbox_maxy FLOAT(18, 2) NOT NULL, 
created_at DATETIME NOT NULL, 
updated_at DATETIME NOT NULL, 
PRIMARY KEY(id)) ENGINE = INNODB;

CREATE TABLE curve (id BIGINT AUTO_INCREMENT, 
name VARCHAR(100) NOT NULL, 
feature_id bigint NOT NULL, 
created_at DATETIME NOT NULL, 
updated_at DATETIME NOT NULL, 
INDEX feature_id_idx (feature_id), 
PRIMARY KEY(id)) ENGINE = INNODB;

ALTER TABLE curve ADD CONSTRAINT curve_feature_id_feature_id 
FOREIGN KEY (feature_id) REFERENCES feature(id) ON DELETE CASCADE;

django classes:

class Feature(models.Model):

    class Meta:
        db_table = 'feature'

    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    description = models.CharField(max_length=100)
    pivotXpos = models.FloatField()
    pivotYpos = models.FloatField()
    pivotXpos = models.FloatField()
    referenceImageUrl = models.CharField(max_length=200)
    referenceThumbnailImageUrl = models.CharField(max_length=200)
    bbox_minx = models.FloatField()
    bbox_miny = models.FloatField()
    bbox_maxx = models.FloatField()
    bbox_maxy = models.FloatField()

    def __unicode__(self):
        return self.name;


class Curve(models.Model):

    class Meta:
        db_table = 'curve'

    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    feature_id = models.ForeignKey(Feature)

    def __unicode__(self):
        return self.name;

the crash (inside the django shell)

>>> Curve.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 72, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 87, in __len__
    self._result_cache.extend(self._iter)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 291, in iterator
    for row in compiler.results_iter():
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 763, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 818, in execute_sql
    cursor.execute(sql, params)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/backends/util.py", line 40, in execute
    return self.cursor.execute(sql, params)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 114, in execute
    return self.cursor.execute(query, args)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
DatabaseError: (1054, "Unknown column 'curve.feature_id_id' in 'field list'")
user257543
  • 881
  • 1
  • 14
  • 35
  • What is the exact nature of the "crashes"? It's not clear to me why different index names and constraint names should affect Django ORM. – Ludwik Trammer Oct 27 '13 at 15:49

2 Answers2

1

This is the error: (1054, "Unknown column 'curve.feature_id_id' in 'field list'") So, if you don't want to specify the db_column as user257543 supposes, you could write instead

feature = models.ForeignKey(Feature)

which is even cleaner

0

Not sure about the constraint/index names but I was able to solve this by using the 'db_column' field option on the ForeignKeyField

feature_id = models.ForeignKey(Feature,db_column='feature_id')
user257543
  • 881
  • 1
  • 14
  • 35