2017-04-26 132 views
1

我寫了一個腳本來在SQL服務器之間複製表。 它的工作原理,但其中一列更改從varchar到文本的類型... 如何使它複製具有相同列類型的表?熊貓to_sql將列類型從varchar更改爲文本

import pymssql 
import pandas as pd 
from sqlalchemy import create_engine 


db_server= 1.2.3.4\\r2 
db_database="Test_DB" 
db_user="vaf" 
db_password="1234" 

local_db_server="1.1.1.1\\r2" 
local_db_database="Test_DB" 
local_db_user="vaf" 
local_db_password="1234" 

some_query=(""" 
select * from some_table 
""") 




def main(): 
    conn=pymssql.connect(server=local_db_server,user=local_db_user,password=local_db_password,database=local_db_database,charset='UTF-8') 
    data=pd.io.sql.read_sql(some_query,conn) 

    connection_string='mssql+pymssql://{}:{}@{}/{}'.format(db_user,db_password,db_server,db_database) 
    engine=create_engine(connection_string) 
    data.to_sql(name="some_table",con=engine,if_exists='replace',index=False) 

if __name__ == "__main__": 
    main() 

感謝

回答

3

考慮三種方法:

具體列舉(積極的,因爲它預期未來)

使用的pandas.DataFrame.to_sqlD型參數,請傳遞的字典用於命名列的sqlalchemy types

data.to_sql(name="some_table", con=engine, if_exists='replace', index=False, 
      dtype={'datefld': sqlalchemy.DateTime(), 
        'intfld': sqlalchemy.types.INTEGER(), 
        'strfld': sqlalchemy.types.VARCHAR(length=255), 
        'floatfld': sqlalchemy.types.Float(precision=3, asdecimal=True), 
        'booleanfld': sqlalchemy.types.Boolean} 

刪除數據(積極的,因爲它預期未來)

清理表DELETE動作查詢。然後,只將來自熊貓的數據遷移到SQL Server,而不會在結構上更改表格,因爲to_sql替換爲參數重新創建表。此方法假定數據庫表與數據庫表始終保持一致(沒有新列/更改類型)。

def main(): 
    connection_string = 'mssql+pymssql://{}:{}@{}/{}'\ 
         .format(db_user,db_password,db_server,db_database) 
    engine = create_engine(connection_string) 

    # IMPORT DATA INTO DATA FRAME 
    data = pd.read_sql(some_query, engine) 

    # SQL DELETE (CLEAN OUT TABLE) VIA TRANSACTION 
    with engine.begin() as conn:  
     conn.execute("DELETE FROM some_table") 

    # MIGRATE DATA INTO DATA FRAME (APPEND NOT REPLACE) 
    data.to_sql(name='some_table', con=engine, if_exists='append', index=False) 

MODIFY COLUMN(反應性,因爲它固定的ad-hoc)

改變與一個DDL SQL語句遷移後的列。

def main(): 
    connection_string = 'mssql+pymssql://{}:{}@{}/{}'\ 
         .format(db_user,db_password,db_server,db_database) 
    engine = create_engine(connection_string) 

    # IMPORT DATA INTO DATA FRAME 
    data = pd.read_sql(some_query, engine) 

    # MIGRATE DATA INTO DATA FRAME 
    data.to_sql(name="some_table", con=engine, if_exists='replace', index=False) 

    # ALTER COLUMN TYPE (ASSUMING USER HAS RIGHTS/PRIVILEGES) 
    with engine.begin() as conn:  
     conn.execute("ALTER TABLE some_table ALTER COLUMN mytextcolumn VARCHAR(255);") 

我推薦第二種方法,因爲我相信數據庫應該是不可知的像Python和熊貓的應用程序代碼。因此,表架構的初始構建/重新構建應該是一個有計劃的手動過程,並且任何腳本都不應該在結構上動態更改數據庫,只會與數據交互。

相關問題