使用Python将数据从MSSQL数据库复制到PostgreSQL数据库
我有两个数据库,一个是MSSQL,另一个是Postgresql。我希望我的Python脚本每天都能运行(为此我在Linux上使用了定时任务)。MSSQL数据库中的数据需要复制到Postgresql数据库。我有个想法,但它不管用。你能帮帮我吗?也许我的解决方案完全错了……
这是我的代码:
import pymssql, psycopg2
class DatabaseRequest:
def __init__(self):
self.conn1 = pymssql.connect(host='****', user='****', password='****', database='****')
self.conn2 = psycopg2.connect("dbname='****' user='****' host='*****' password='****'")
self.cur1 = self.conn1.cursor()
self.cur2 = self.conn2.cursor()
def request_proc(self, rows):
self.cur1.execute("SELECT top 10 tag, site, plant, unit, line, ProcessID AS pid, Count(ReadTime) AS mods \
FROM ( \
select dateadd(dd, -1, convert(varchar, getDate(),111)) \
as tag, ReadTime, processID, subid, PR.Site, PR.Plant, PR.Unit, PR.Line \
from FactBarcodeReading BCR with(nolock) \
inner join DimProcess PR on BCR.ProcessKey = PR.ProcessKey \
where PR.ProcessID IN (802, 1190, 1800, 3090, 3590, 4390, 4590, 4800, 5000, 5400, 4190) \
and ReadTime between dateadd(dd, -1, convert(varchar, getDate(),111)) and dateadd(dd, -0, convert(varchar, getDate(),111)) \
) a \
GROUP BY tag, site, plant, unit, line, ProcessID \
ORDER BY site, plant, unit, line, ProcessID")
rows = self.cur1.fetchone()
# return rows
def insert_proc(self):
self.cur2.execute("INSERT INTO 20091229global (proddate, site, plant, unit, line, pid, mods) \
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')"
% self.cur1.fetchone())
a = DatabaseRequest()
print a.insert_proc()
附注:request_proc这个部分运行得很好。
3 个回答
0
我刚看到这个讨论,之前我也试着自己找答案。你可以使用一个叫做 execute_values() 的方法,这个方法在 psycopg2.extras 里。
在文档中,你可以在底部找到这个方法,链接是 https://www.psycopg.org/docs/extras.html。只需要传入一个字符串变量,然后把那个占位符定义成一个值的列表就可以了。
0
你还需要把光标(cur1)传递给 insert_proc -->
def insert_proc(self, cur1):
self.cur2.execute("INSERT INTO 20091229global (proddate, site, plant, unit, line, pid, mods) \
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')"
% self.cur1.fetchone())
1
如果你的代码没有报错,但插入的记录在Postgresql数据库中看不到,可能是因为你需要在执行INSERT语句后加上self.conn2.commit()
。这样做可以把每次操作都保存到数据库里。
根据文档,你也可以选择开启自动提交,这样就不需要每次手动提交了。