将数据从一个加载到另一个时出现 pygrametl KeyError table
pygrametl KeyError when loading data from one to another table
我正在试验 pygrametl,试图从数据库(源)中的一个 table 获取数据到目标数据库中的另一个 table。
来源 table 具有以下架构:
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=' ';
目标 table 使用以下架构:
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 (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'
您的属性应该在查询产生的数据中。您可以使用:
name_mapping = 'dname', 'ddescr'
attributes=['dname', 'ddescr'])
或:
name_mapping = 'fname', 'descr'
attributes=['fname', 'descr'])
我正在试验 pygrametl,试图从数据库(源)中的一个 table 获取数据到目标数据库中的另一个 table。
来源 table 具有以下架构:
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=' ';
目标 table 使用以下架构:
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 (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'
您的属性应该在查询产生的数据中。您可以使用:
name_mapping = 'dname', 'ddescr'
attributes=['dname', 'ddescr'])
或:
name_mapping = 'fname', 'descr'
attributes=['fname', 'descr'])