2016-09-21 18 views
1

MySQLデータベースに次の形式のファイルをロードする必要があります。xmlファイルから2つのテーブルにデータをインポートするMySQLデータベースの外部キー

<item value="{$\emptyset $}"> 
    <subitem value="(empty language)"></subitem> 
    <subitem value="(empty set)"></subitem> 
</item> 
<item value="{$\subseteq$ (subset)}"> 
</item> 
<item value="{$\subset$ (proper subset)}"> 
</item> 
<item value="{$:$ (such that)}"> 
</item> 
<item value="{$\cap$ (set intersection)}"> 
</item> 
<item value="{$\cup$ (set union)}"> 
</item> 
<item value="{$-$ (set difference)}"> 
</item> 
<item value="{$\left | \mskip \medmuskip \right |$}"> 
    <subitem value="(flow value)"></subitem> 
    <subitem value="(length of a string)"></subitem> 
    <subitem value="(set cardinality)"></subitem> 
</item> 

私は、データベース内に、2つのテーブルで表現する必要があり、サブ項目テーブルに外部キーが含まれているべきだと思う:

項目< - サブアイテム

私のpythonでそれをやってみたいです。それはMySQLの命令でのみ達成することは可能ですか、またはPythonでXMLファイルをロードし、両方のテーブルを手動で作成し、すべてのエントリを私が望むテーブルに挿入する方が良いですか?

答えて

0

私はPythonでxmlを読んで、それをMySQLデータベースに挿入することでそれを実行できました。必要なソフトウェアをインストールするための最初の必要性:

sudo apt install mysql-server 
sudo apt-get install python-mysqldb 

そして、このPY-ファイルは、仕事をする:

import xml.etree.ElementTree 
import MySQLdb 

try: 
    db = MySQLdb.connect(host="localhost", 
         user="root", 
         passwd="!") 

    cur = db.cursor() 

    cur.execute("DROP DATABASE IF EXISTS i2a") 
    cur.execute("CREATE DATABASE i2a") 
    cur.execute("USE i2a") 
    print "Created database" 

    cur.execute(""" 
     CREATE TABLE Item (
      id INT NOT NULL AUTO_INCREMENT, 
      `value` VARCHAR(255) NOT NULL, 
      PRIMARY KEY (`id`) 
     ) 
     DEFAULT CHARACTER SET = utf8 
     COLLATE = utf8_bin""") 
    print "Created Item table" 

    cur.execute(""" 
     CREATE TABLE Subitem (
      id INT NOT NULL AUTO_INCREMENT, 
      item_id INT NOT NULL, 
      `value` VARCHAR(255) NOT NULL, 
      PRIMARY KEY (`id`), 
      FOREIGN KEY (item_id) REFERENCES Item(id) ON DELETE RESTRICT 
     ) 
     DEFAULT CHARACTER SET = utf8 
     COLLATE = utf8_bin""") 
    print "Created Subitem table" 

    e = xml.etree.ElementTree.parse('index.xml').getroot() 

    for item in e.findall('item'): 
     cur.execute("INSERT INTO Item (value) VALUES (%s)", [item.get('value')]) 
     for subitem in item: 
      cur.execute("INSERT INTO Subitem (item_id, value) VALUES (%s, %s)", (db.insert_id(), subitem.get('value'))) 
    print "All data are there!" 
except Exception, e: 
    print str(e) 
関連する問題