我写了一个小脚本来在SQL服务器之间复制一个表。 它可以工作,但是其中一列的类型从varchar更改为text。。。 如何复制具有相同列类型的表?
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()
谢谢
考虑三种方法:
指定类型
使用^{} 的dtype参数,为命名列传递sqlalchemy types字典。
删除数据
使用
DELETE
操作查询清除表。然后,只将数据从pandas迁移到SQL Server,而不改变表的结构,因为to_sql
replace参数重新创建了表。这种方法假设dataframe总是与数据库表保持一致(没有新列/更改的类型)。修改列(当它修复特殊列时是被动的)
使用DDL SQL语句更改迁移后的列。
我建议使用第二种方法,因为我认为数据库应该对python和pandas之类的应用程序代码是不可知的。因此,表模式的初始构建/重新构建应该是一个有计划的手动过程,任何脚本都不应该动态地改变数据库的结构,而应该只与数据交互。
相关问题 更多 >
编程相关推荐