我有一个由doctrine / 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 }
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课程:
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'")
答案 0 :(得分:1)
这是错误: (1054,“字段列表中的未知列''curve.feature_id_id'”) 所以,如果你不想像user257543那样指定db_column, 你可以改为写
feature = models.ForeignKey(Feature)
哪个更干净
答案 1 :(得分:0)
不确定约束/索引名称但我能够通过使用ForeignKeyField上的'db_column'字段选项来解决这个问题
feature_id = models.ForeignKey(Feature,db_column='feature_id')