【问题标题】:pygrametl KeyError when loading data from one to another table将数据从一个表加载到另一个表时出现pygrametl KeyError
【发布时间】:2018-01-22 21:41:26
【问题描述】:

我正在试验 pygrametl,试图将数据从数据库(源)中的一个表中获取到目标数据库中的另一个表中。

源表具有以下架构:

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=' ';

目标表使用以下架构:

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;

在python中我有以下代码:

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()

我得到的错误如下:

Traceback(最近一次调用最后一次):文件“.\testex.py”,第 35 行,in sourceDimension.insert(row) 文件“Python\Python36-32\lib\site-packages\pygrametl\tables.py”,第 357 行, 在插入 self.targetconnection.execute(self.insertsql, row, namemapping) 文件 "Python\Python36-32\lib\site-packages\pygrametl__init__.py", 第 663 行,执行中 self.__cursor.execute(stmt, arguments) 文件“Python\Python36-32\lib\site-packages\pymysql\cursors.py”,第 164 行, 在执行 query = self.mogrify(query, args) 文件“Python\Python36-32\lib\site-packages\pymysql\cursors.py”,第 143 行, 在 mogrify query = query % self._escape_args(args, conn) KeyError: 'dname'

【问题讨论】:

    标签: python etl data-warehouse python-3.6 pygrametl


    【解决方案1】:

    您的属性应该在查询产生的数据中。您可以使用:

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

    或:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多