Opened 11 years ago
Last modified 11 years ago
#23279 closed Bug
REFERENCES constraints are not set to the fileds in an intermediate table created by syncdb for SQLite3 — at Initial Version
| Reported by: | Annadel | Owned by: | nobody |
|---|---|---|---|
| Component: | Uncategorized | Version: | 1.6 |
| Severity: | Normal | Keywords: | syncdb manytomany |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
If I have the following class definition:
class Foo(models.Model):
bars = models.ManyToManyField('Bar')
class Meta:
db_table = 'foo'
class Bar(models.Model):
class Meta:
db_table = 'bar'
Then, syncdb will create in SQLite3 the following intermediate table. Note that there is no REFERENCES constrains defined.
CREATE TABLE "foo_bars" (
"id" integer NOT NULL PRIMARY KEY,
"foo_id" integer NOT NULL,
"bar_id" integer NOT NULL,
UNIQUE ("foo_id", "bar_id")
)
CREATE INDEX "foo_bars_e69b476d" ON "foo_bars" ("bar_id");
CREATE INDEX "foo_bars_ef315d12" ON "foo_bars" ("foo_id")
If I define ManyToManyField in Bar class as opposed to Foo class, such as
class Foo(models.Model):
class Meta:
db_table = 'foo'
class Bar(models.Model):
foos = models.ManyToManyField(Foo)
class Meta:
db_table = 'bar'
Then, the intermediate table becomes:
CREATE TABLE "bar_foos" (
"id" integer NOT NULL PRIMARY KEY,
"bar_id" integer NOT NULL,
"foo_id" integer NOT NULL REFERENCES "foo" ("id"),
UNIQUE ("bar_id", "foo_id")
)
CREATE INDEX "bar_foos_e69b476d" ON "foo_bars" ("bar_id");
CREATE INDEX "bar_foos_ef315d12" ON "foo_bars" ("foo_id")
Now only foo_id has REFERENCES constraint.
If I choose MySQL instead of SQLite3, syncdb creates REFERENCE constrains for both foo_id and bar_id, as follows:
CREATE TABLE bar_foos (
idint(11) NOT NULL AUTO_INCREMENT,
bar_idint(11) NOT NULL,
foo_idint(11) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEYbar_id(bar_id,foo_id),
KEYbar_foos_e69b476d(bar_id),
KEYbar_foos_ef315d12(foo_id),
CONSTRAINTbar_id_refs_id_9d8d0296FOREIGN KEY (bar_id) REFERENCESbar(id),
CONSTRAINTfoo_id_refs_id_27f38014FOREIGN KEY (foo_id) REFERENCESfoo(id)
) ENGINE=InnoDB
So, there seems an issue when syncdb creates an intermediate table derived from ManyToManyField for SQLite3.