2012-09-19 52 views
4

最近纔開始使用python,我喜歡它!但是,我堅持使用SqlAlchemy。SqlAlchemy:將表導出到新數據庫

我正在嘗試編寫一個腳本,用於讀取MS SQL數據庫,查詢表(所有字段,只對某些字段進行過濾),並將結果寫入本地SQLite數據庫。

(目的是寫一個數據適配器:將結果導出到另一個數據庫之前執行SQLite數據庫上的一些查詢在目標數據庫寫入臨時表也可以。)

我可以做一個連接和獲得查詢結果 - 我可以打印它們,所以我知道該部分的作品。但是,如何根據源SQL Server的查詢結果創建新表?

這工作:

import sqlalchemy 

esd = sqlalchemy.create_engine('mssql+pyodbc://username:passwordSservername/dbname') 
for row in esd.execute('select * from ticket_actions where log_dt > \'2012-09-01\''): 
    print(row.eFolderID) 

這也適用於:

import pyodbc 
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=servername;DATABASE=dbname;UID=username;PWD=password') 
cursor = cnxn.cursor() 
for row in cursor.execute('select * from ticket_actions where log_dt > \'2012-09-01\''): 
    print(row.eFolderID) 

如何創建具有相同結構的新表的查詢有任何想法?

謝謝!

回答

2

Creating and Dropping Database Tables

...創建單獨的表可以通過create()做...的Table方法。

爲了讀取源結構,參見Reflecting Database Objects

Table對象可以指示從數據庫中已經存在的相應的數據庫架構對象加載關於自身的信息。
[...]
反射系統也可以反映意見。

+0

我知道創建表,但反射 - 這就是我一直在尋找,感謝一下! – Jerry

+0

該鏈接不再起作用;我猜這是新的:http://docs.sqlalchemy.org/en/latest/core/reflection.html,要引用,「在最簡單的情況下,你只需要指定表名,MetaData對象,並且autoload = True標誌。「 –

1

測試此:

def copy_table(src_session, src_class, dst_session, dst_class): 
    r=src_session.query(src_class).all() 
    for i in r: 
     j=dst_class() 
     [setattr(j, col.name, getattr(i, col.name)) for col in i.__table__.columns] 
     dst_session.add(j) 

se1=db1.Session() 
se2=db2.Session() 
copy_table(se1, db1.Book, se2, db2.Book) 
se2.commit()