2017-08-15 2 views
0

J'expérimente avec pygrametl, en essayant d'obtenir des données d'une table dans une base de données (source) dans une autre table dans une base de données de destination.pygrametl KeyError lors du chargement de données d'une table vers une autre

La table source a le schéma suivant:

CREATE TABLE `sdata` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `fname` varchar(255) DEFAULT NULL, 
    `descr` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT=' '; 

Le tableau de destination utilise le schéma suivant:

CREATE TABLE `dtable` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `dname` varchar(255) DEFAULT NULL, 
    `ddescr` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

En python je le code suivant:

import pygrametl 
from pygrametl.datasources import SQLSource, CSVSource 
from pygrametl.tables import Dimension, FactTable, SlowlyChangingDimension 
import pymysql 

sourceDatabase = pymysql.connect(host='localhost', user='root', password='pass', database='source') 
destDatabase = pymysql.connect(host='localhost', user='root', password='pass', database='dest') 

dw_conn_wrapper = pygrametl.ConnectionWrapper(connection=destDatabase) 

sql = "SELECT fname, descr from sdata" 

name_mapping = 'fname', 'descr' 

source = SQLSource(connection=sourceDatabase, query=sql, names=name_mapping) 

destDimension = Dimension(
    name='dtable', 
    key='id', 
    attributes=['dname', 'ddescr']) 

for row in source: 
    print(row) 
    destDimension.insert(row) 

dw_conn_wrapper.commit() 
dw_conn_wrapper.close() 

sourceDatabase.close() 

Le erreur que je reçois est la suivante:

Traceback (most recent call last): File ".\testex.py", line 35, in sourceDimension.insert(row) File "Python\Python36-32\lib\site-packages\pygrametl\tables.py", line 357, in insert self.targetconnection.execute(self.insertsql, row, namemapping) File "Python\Python36-32\lib\site-packages\pygrametl__init__.py", line 663, in execute self.__cursor.execute(stmt, arguments) File "Python\Python36-32\lib\site-packages\pymysql\cursors.py", line 164, in execute query = self.mogrify(query, args) File "Python\Python36-32\lib\site-packages\pymysql\cursors.py", line 143, in mogrify query = query % self._escape_args(args, conn) KeyError: 'dname'

Répondre

1

Vos attributs devraient figurer dans les données résultant de la requête. Vous utilisez soit:

name_mapping = 'dname', 'ddescr' 
attributes=['dname', 'ddescr']) 

ou:

name_mapping = 'fname', 'descr' 
attributes=['fname', 'descr'])