3

同じコードスニペットの場合、SQLAlchemyはMac OXで外部キー制約を作成しますが、DebianLinuxでは外部キー制約を作成できません。

環境と図書館:

Python 2.7

SQLAlchemy 0.7.8

MySQL-python-1.2.3 [これはコネクタであり、ここで何かが間違っていると思われます]

コードスニペット:

class PRStatusCV(globalBase):

    __tablename__ = 'pr_status_cv'
    pr_status_cv_id = Column(Integer, primary_key=True)
    name            = Column(VARCHAR(100), nullable=False, unique=True)

    def __init__(self, id, name, desc):
        self.pr_status_cv_id = id
        self.name            = name
        self.description     = desc



class PhysicalRun(globalBase):

    __tablename__ = 'prs'
    pr_id       = Column(Integer, primary_key=True)
    run_name              = Column(VARCHAR(200), nullable=False, unique=True)
    pr_status_cv_id       = Column(Integer, ForeignKey('pr_status_cv.pr_status_cv_id'))

    def __init__(self, name, status):
        self.run_name              = name
        self.pr_status_cv_id       = status

Debian Linuxでは、作成されるテーブルには次のものが含まれます。

CREATE TABLE `prs` (
  `pr_id` int(11) NOT NULL AUTO_INCREMENT,
  `run_name` varchar(200) NOT NULL,
  `pr_status_cv_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`pr_id`),
  UNIQUE KEY `run_name` (`run_name`),
  KEY `pr_status_cv_id` (`pr_status_cv_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 

Mac OSXでは、作成されるテーブルは次のようになります。

CREATE TABLE `prs` (
  `pr_id` int(11) NOT NULL AUTO_INCREMENT,
  `run_name` varchar(200) NOT NULL,
  `pr_status_cv_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`pr_id`),
  UNIQUE KEY `run_name` (`run_name`),
  KEY `pr_status_cv_id` (`pr_status_cv_id`),
  CONSTRAINT `prs_ibfk_1` FOREIGN KEY (`pr_status_cv_id`) REFERENCES `pr_status_cv` (`pr_status_cv_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

観察:Mac OSXの場合、SQLAlchemyはデフォルトでInnoDB DBエンジンを選択し、DebianにはMyISAMが選択されているようです。なぜこれが起こっているのか考えていますか?

制約を持たせるためCONSTRAINT `prs_ibfk_1` FOREIGN KEY (`pr_status_cv_id`) REFERENCES `pr_status_cv`に、単にではなく、どのような変更を加える必要がありKEY `pr_status_cv_id` (`pr_status_cv_id`)ますか?

私のDebianPythonデプロイに何か問題がありますか?

4

2 に答える 2

1

ENGINE=MyISAMMyISAM には外部キーがありません

__table_args__ = {'mysql_engine':'InnoDB'}InnoDB をインストールするために追加

于 2012-07-16T20:48:28.483 に答える
0

default-storage-enginge、2 つのシステム間で異なる設定になっている可能性があります。このオプションの設定方法については、オプション ファイルも参照してください。理想的には、これをデフォルトのままにしないでください。mysql_engineのオプションを使用しTable()て、mysql 接続でそれを強制します。

于 2012-07-16T21:00:09.380 に答える