1

mysql でアプリケーションの DB 構造を作成したいのですが、さまざまなスキーマでテーブル、sp、関数を作成するスクリプトが 100 個ほどあります。

スクリプトを次々に実行する方法と、前のスクリプトが失敗した場合に停止する方法を提案してください。MySQL 5.6 バージョンを使用しています。

私は現在、テキストファイルを使用してそれらを実行しています。

mysql> source /mypath/CreateDB.sql

を含む

tee /logout/session.txt
source /mypath/00-CreateSchema.sql
source /mypath/01-CreateTable1.sql
source /mypath/01-CreateTable2.sql
source /mypath/01-CreateTable3.sql

しかし、それらは同時に実行されており、エラーが発生しているため、以下の表に外部キーがあります。

4

2 に答える 2

0

SQL ファイルを実行する Python 関数を作成しました。

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Download it at http://sourceforge.net/projects/mysql-python/?source=dlp
# Tutorials: http://mysql-python.sourceforge.net/MySQLdb.html
#            http://zetcode.com/db/mysqlpython/
import MySQLdb as mdb 

import datetime, time

def run_sql_file(filename, connection):
    '''
    The function takes a filename and a connection as input
    and will run the SQL query on the given connection  
    '''
    start = time.time()

    file = open(filename, 'r')
    sql = s = " ".join(file.readlines())
    print "Start executing: " + filename + " at " + str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M")) + "\n" + sql 
    cursor = connection.cursor()
    cursor.execute(sql)    
    connection.commit()

    end = time.time()
    print "Time elapsed to run the query:"
    print str((end - start)*1000) + ' ms'



def main():    
    connection = mdb.connect('127.0.0.1', 'root', 'password', 'database_name')
    run_sql_file("my_query_file.sql", connection)    
    connection.close()

if __name__ == "__main__":
    main()

ストアド プロシージャや大きな SQL ステートメントで試したことはありません。また、複数の SQL クエリを含む SQL ファイルがある場合は、split(";") を実行して各クエリを抽出し、各クエリcursor.execute(sql)に対して呼び出す必要がある場合があります。この回答を自由に編集して、これらの改善を組み込んでください。

于 2013-10-07T21:13:34.597 に答える
0

スクリプトは同時に実行されていません。mysql クライアントはマルチスレッド方式では実行されません。

しかし、まだ定義していないテーブルを外部キーが参照する順序でスクリプトを取得している可能性があり、これは問題です。

この問題には、次の 2 つの修正方法があります。

  • この問題を回避するために、テーブルを作成してください。

  • ALTER TABLE ADD FOREIGN KEY外部キーなしですべてのテーブルを作成してから、 ... ステートメントを含む別のスクリプトを実行します。

于 2013-10-07T21:23:57.767 に答える