0

我有一个由学说/symfony1.4 生成的 mysql 数据库,我需要一个单独的 django 1.4 项目来引用同一个 mysql 数据库上的现有表。该数据库由许多面向客户端的 UI 共享,并且无法迁移或复制,symfony 和 django 都需要引用/更新同一数据库上的相同表,以便面向客户端的 UI 保持同步。不幸的是,首先出现了学说,并在这些表之间创建了约束名称和索引名称,我找不到如何强制 django 使用相同的名称。当我尝试将这些现有表包装在 django 对象中时,这会导致崩溃。

任何想法如何覆盖或强制 django 1.4 模型使用特定的外键约束名称和索引?

更新:添加有关表设置和崩溃的更多信息

学说架构:

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 }

表 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类:

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;

崩溃(在 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'")
4

2 回答 2

1

这是错误: (1054, "Unknown column 'curve.feature_id_id' in 'field list'") 所以,如果你不想像 user257543 所假设的那样指定 db_column,你可以改写

feature = models.ForeignKey(Feature)

更干净

于 2014-03-06T14:02:39.847 回答
0

不确定约束/索引名称,但我能够通过使用 ForeignKeyField 上的“db_column”字段选项来解决这个问题

feature_id = models.ForeignKey(Feature,db_column='feature_id')
于 2013-10-28T07:39:45.633 回答