2015-07-19 76 views
5

我從Excel文件加載和組織爲蟒蛇字典,其中每個鍵是數據庫表的名稱和它的值被定義爲詞典列表我的數據。該數據需要(行)如何使用sqlalchemy將數據加載到現有數據庫表中?

system_data = {table_name1:[{'col_1':val1, 'col2': val1...}, 
          {'col_1':val2, 'col2': val2..}..],  
       table_name2:[{},{}..],[{},{}..]..} 

被加載到現有的數據庫,同時選取table_names鍵和值從system_data

此外,我使用ordered_table列表,我已經創建了特定的順序,以避免加載數據時FK問題。

這裏是代碼(1000個版本的我試過之一):

from sqlalchemy import create_engine 
from sqlalchemy.sql import insert 

def alchemy_load(): 
    system_data = load_current_system_data() 
    engine = create_engine('mysql+pymysql://username:[email protected]/my_db') 
    conn = engine.connect() 
    for table_name in ordered_tables: 
     conn.execute(insert(table_name, system_data[table_name])) 
    print("System's Data successfully loaded into Database!") 

此功能產生以下錯誤:

"TypeError: 'method' object is not iterable" 

我已經浪費了幾乎所有的一天,在這(((

所有的在線示例都描述了用戶使用MetaData並創建自己的表格的情況......沒有關於如何將數據實際添加到現有表格中的問題

有一個解決方案,我的問題使用「數據集」庫。

代碼:

import dataset 

def current_data(): 
    db = dataset.connect(url='mysql+pymysql://user:[email protected]/my_db') 
    system_data = load_current_system_data() 

    for table_name in ordered_tables: 
     db[table_name].insert_many(system_data[table_name]) 
    print("System's Data successfully loaded into Database!") 

,但我不知道如何實現使用SQLAlchemy的驗證碼...

任何幫助將不勝感激。

+0

您應該查看使用堆棧溢出時的SQLalchemy表對象的示例。 –

+0

已經完成了這個工作,有很多「靜態」示例,您可以在其中創建表並加載數據。此外,互聯網上有幾十個「複製/粘貼」教程,實際上是相同的。我想我可以通過使用直接的驅動程序API(如MySQLdb或PyMySQL)來實現此目標......但是,如何使用SQLalchemy實現這一目標?你能提供一些代碼片段還是隻糾正我的代碼?謝謝。 – bravoelf

+0

如果你有csv數據,它可以很容易地進入mysql。如果它必須在sqlalchemy中,則可以創建更小的幫助區域。因此是那些使用orms並陷入膠水陷阱的人的困境。 – Drew

回答

4

使用SQLAlchemymetadata會是這樣的一個可能的解決方案:

In [7]: 

from sqlalchemy.schema import MetaData 
meta = MetaData() 
meta.reflect(bind=engine) 

In [20]: 

for t in meta.tables: 
    for x in engine.execute(meta.tables[t].select()): 
     print x 
(1, u'one') 
(2, u'two') 
(1, 1, 1) 
(2, 1, 2) 
(3, 2, 0) 
(4, 2, 4) 

(我用的選擇,而不是插入並將其應用到一個愚蠢的數據庫中,我已經得到了試驗)

希望它幫助。

編輯:經過評論,我補充說明一下。

MetaData(),tables是架構中表的字典。字典按表名稱排序,它實際上與代碼中的字典非常相似。你可以遍歷元數據就是這樣,

for table_name, table in meta.tables.items(): 
    for x in engine.execute(table.select()): 
     print x 

,或者試圖把它改編成你的代碼,你可以只是這樣做,

for table_name in ordered_tables: 
    conn.execute(meta.tables[table_name].insert_many(system_data[table_name])) 
+0

太棒了!你給我的方式......昨天我已經閱讀了SA中的元數據類,但我不確定是否可以將table_name字符串傳遞給它。檢查它也。 – bravoelf

+0

不知道我已經完全理解你的評論,但我已經更新了答案,試圖澄清。 – lrnzcig

+0

謝謝。我試圖說,我沒有清楚地理解「如何以及在哪裏」傳遞table_ name字符串。現在我可以看到meta.tables [table_name string]接受它。問題是我對OOP(特別是Python)和SQLAlchemy概念很陌生。由於這個原因,我的一些問題可能對其他人來說太愚蠢了。儘管如此,我仍在努力提高自己的技能並學習更多東西。再次感謝您的時間和答覆。 – bravoelf

0

因此,這裏是最後的代碼(非常感謝Irnzcig爲指導,併爲我自己徹底重新閱讀官方SA文檔^ _ ^)。

from sqlalchemy import create_engine, MetaData 
# from myplace import load_current_system_data() and other relevant functions 

def alchemy_current(): 
    system_data = load_current_system_data() 
    engine = create_engine('mysql+pymysql://user:[email protected]/your_db_name') 
    meta = MetaData() 
    meta.reflect(bind=engine) 
    conn = engine.connect() 
    for table_name in ordered_tables: 
     conn.execute(meta.tables[table_name].insert().values(system_data[table_name])) 
    conn.close() 
    # engine.dispose() 

    print("System's Data successfully loaded into Database!") 

這一切都應該工作,假設一個有:

1. Existing mysql database. 
    2. An organized data as I've described prior in this question. 
    3. An ordered `table_name_list` in order to keep referential integrity and avoid FK problems. 

萬一有人有一個「改進建議」,我會很高興地聽到。

Ivan。

相關問題