Ошибка при перемещении данных из базы данных в другую - PullRequest
1 голос
/ 14 мая 2019

Ошибка в коде ETL на Python

Мне удалось выучить несколько строк кода на python для выполнения процессов ETL в среде MS SQL. исходный скрипт был для среды PostgreSQL. Я хочу использовать мой для MS SQL. Я пытался редактировать код, но я получил ошибку. Пожалуйста, посмотрите

import petl as etl, pyodbc as py, sys
from sqlalchemy import *

reload(sys)
sys.setdefaultencoding('utf8')

dbCnxns = {'sample' :"dbname=sample user=user host=127.0.0.1" 
           , 'python': "dbname=python user=user host=127.0.0.1" }

#set my connection
sourceConn = py.connect(dbCnxns['sample'])
targetConn = py.connect(dbCnxns['python'])
sourceCursor = sourceConn.cursor()
targetCursor = targetConn.cursor()

sourceCursor.execute = ('SELECT name from sys.tables')


sourceTables = sourceCursor.fetchall()

for t in sourceTables:
    targetCursor.execute("drop table if exist %s" % (t[0]))
    sourceDs = etl.fromdb(sourceConn, "select * from %s" % (t[0]))
    etl.todb(sourceDs,targetConn,t[0], create=True, sample=1000)

Спасибо

После некоторых правок. Я был в состоянии написать код для MSSQL D. Вот коды до

import petl as etl, pyodbc as py
#from sqlalchemy import *

#reload(sys)
#sys.setdefaultencoding('utf8')

#dbCnxns = {'sample' : "Driver={SQL Server} Server=USER-PC Database=sample Trusted_Connection=yes" 
#           , 'python': "Driver={SQL Server} Server=USER-PC Database=python Trusted_Connection=yes" }

#set my connection
#sourceConn = pg.connect(dbCnxns['sample'])
#targetConn = pg.connect(dbCnxns['python'])
#sourceCursor = sourceConn.cursor()
#targetCursor = targetConn.cursor()

#sourceCursor.execute = (***SELECT * FROM sample.dbo.Customer***)


sourceConn = py.connect('Driver={SQL Server};'
                      'Server=USER-PC;'
                      'Database=sample;'
                      'Trusted_Connection=yes;')

targetConn = py.connect('Driver={SQL Server};'
                      'Server=USER-PC;'
                      'Database=python;'
                      'Trusted_Connection=yes;')

sourceCursor = sourceConn.cursor()
targetCursor = targetConn.cursor()

sourceCursor.execute('SELECT name from sys.tables')

sourceTables = sourceCursor.fetchall()

for t in sourceTables:
    targetCursor.execute("drop table if exist %s" % (t[0]))
    sourceDs = etl.fromdb(sourceConn, "select * from %s" % (t[0]))
    etl.todb(sourceDs,targetConn,t[0], create=True, sample=1000)

Сейчас я хорошо выгляжу, но получаю ошибку программирования

ProgrammingError: ('42000', "[42000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Неверный синтаксис рядом с ключевым словом 'if'. (156) (SQLExecDirectW); [42000] [Microsoft] [ Драйвер ODBC SQL Server] [SQL Server] Выражение не-логического типа, указанное в контексте, где ожидается условие, рядом с «Заказчиком». (4145)

Visit https://www.dofactory.com/sql/sample-database

Чтобы увидеть структуры баз данных, над которыми я работаю.

Еще раз спасибо

1 Ответ

0 голосов
/ 15 мая 2019

Поддержка DROP TABLE IF EXISTS ... была введена в Microsoft SQL Server 2016. Очевидно, вы используете более раннюю версию SQL Server, поэтому вам придется использовать обходной путь.См. этот вопрос для деталей.

...