Будет ли Sqlalchemy автоматически создавать индекс для внешнего ключа? - PullRequest
1 голос
/ 23 февраля 2012

Я использую движок MyISAM в MYSQL. Я считаю, что внешние ключи в таблице были автоматически созданы индексы. Поведение Sqlalchemy или MYSQL? Мне не нужен индекс для внешнего ключа. Что я должен делать? Добавить параметр param = False при определении столбца?

Мой код:

class A(Base):
    __tablename__ = "a"
    a_id = Column(BigInteger, primary_key=True, autoincrement=True)

class B(Base):
    __tablename__ = "b"
    b_id = Column(BigInteger, primary_key=True, autoincrement=True)
    a_id = Column(BigInteger, ForeignKey(A.a_id))

Я обнаружил, что индекс a_id в B был создан автоматически. Это правильно? Могу ли я сделать это, если я хочу удалить такой индекс?

class B(Base):
    __tablename__ = "b"
    b_id = Column(BigInteger, primary_key=True, autoincrement=True)
    a_id = Column(BigInteger, ForeignKey(A.a_id), index=False)

Ответы [ 3 ]

1 голос
/ 21 марта 2012

Лафада, вы не правы.KEY a_id (a_id) в таблице b ясно показывает, что индекс был создан для поля внешнего ключа.Это поведение InnoDB - он автоматически создает индекс по полям в отношении внешнего ключа, если такой индекс еще не существует:

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

1 голос
/ 24 февраля 2012

Я создал ваши модели на своем локальном компьютере и не нашел ни одного индекса по внешнему ключу.

Я использую

from sqlalchemy import create_engine

engine = create_engine('mysql://test:test@localhost/test1', echo=True)

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Date, Text, BigInteger, ForeignKey
from sqlalchemy.orm.attributes import InstrumentedAttribute


Base = declarative_base()


class A(Base):
    __tablename__ = "a"
    a_id = Column(BigInteger, primary_key=True, autoincrement=True)

class B(Base):
    __tablename__ = "b"
    b_id = Column(BigInteger, primary_key=True, autoincrement=True)
    a_id = Column(BigInteger, ForeignKey(A.a_id))

Base.metadata.create_all(engine)

И фоновый журнал:

2012-02-24 09:39:24,249 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2012-02-24 09:39:24,249 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,254 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%'
2012-02-24 09:39:24,254 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,277 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
2012-02-24 09:39:24,277 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,288 INFO sqlalchemy.engine.base.Engine SHOW COLLATION
2012-02-24 09:39:24,289 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,292 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2012-02-24 09:39:24,292 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,293 INFO sqlalchemy.engine.base.Engine DESCRIBE `a`
2012-02-24 09:39:24,293 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,321 INFO sqlalchemy.engine.base.Engine ROLLBACK
2012-02-24 09:39:24,322 INFO sqlalchemy.engine.base.Engine DESCRIBE `b`
2012-02-24 09:39:24,322 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,323 INFO sqlalchemy.engine.base.Engine ROLLBACK
2012-02-24 09:39:24,324 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE a (
    a_id BIGINT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (a_id)
)


2012-02-24 09:39:24,324 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,590 INFO sqlalchemy.engine.base.Engine COMMIT
2012-02-24 09:39:24,591 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE b (
    b_id BIGINT NOT NULL AUTO_INCREMENT, 
    a_id BIGINT, 
    PRIMARY KEY (b_id), 
    FOREIGN KEY(a_id) REFERENCES a (a_id)
)


2012-02-24 09:39:24,591 INFO sqlalchemy.engine.base.Engine ()
2012-02-24 09:39:24,762 INFO sqlalchemy.engine.base.Engine COMMIT

Я также проверяю оператор создания таблицы в mysql для a и b.

mysql> show create table a;
+-------+-------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                  |
+-------+-------------------------------------------------------------------------------------------------------------------------------+
| a     | CREATE TABLE `a` (
  `a_id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`a_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table b;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| b     | CREATE TABLE `b` (
  `b_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `a_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`b_id`),
  KEY `a_id` (`a_id`),
  CONSTRAINT `b_ibfk_1` FOREIGN KEY (`a_id`) REFERENCES `a` (`a_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Индекс только по первичным ключам, а не по внешнему ключу.

Пожалуйста, попробуйте этона вашей машине, и если вы обнаружили, что ваша машина создает индекс по внешнему ключу в таблице b, опубликуйте тот журнал и модель, которые вы создали, как я написал в этом ответе.

Надеюсь, это решит вашу проблему.

0 голосов
/ 28 марта 2014

Это поведение MySQL , и это правильно для MySQL. Вы должны смириться с этим фактом. По крайней мере, я не знаю, как избавиться от индексации внешних ключей.

Добавить параметр param = False при определении столбца?

Хм, может быть ... Я попробую.

...