【发布时间】:2017-11-25 01:29:16
【问题描述】:
我正在尝试使用 Python 将数据从 MySQL 数据库迁移到 HANA。我们目前在工作中实施这种迁移的方式是手动的,但计划是每天运行一个脚本来收集前一天的数据(存储在 MySQL 中)并将其移动到 HANA 以使用他们的分析工具。我编写了一个包含 2 个函数的脚本,一个连接到 MySQL 并将查询中的数据临时存储在 Pandas Dataframe 中。第二个函数使用 sqlalchemy-hana 连接器创建一个引擎,我将其输入 Pandas 的 to_sql 函数以将数据存储到 HANA。
下面是对 MySQL 的第一个函数调用
def connect_to_mysql(query):
try:
#connect to the db
stagedb = myscon.connect(
user = 'user-name',
password = 'password',
host = 'awshost.com',
database = 'sampletable',
raise_on_warnings = True)
df = pandas.read_sql(query, stagedb)
except myscon.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print('Incorrect user name or password')
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exit")
else:
print(err)
finally:
if central_stagedb:
central_stagecur.close()
central_stagedb.close()
return df
这是连接到 HANA 的第二个函数调用
def connect_to_hana(query):
#connect to HANA db
try:
engine = create_engine('hana://username:password@host:port')
#return dataframe from first function
to_df = connect_to_mysql(query)
to_df.to_sql('sample_data', engine, if_exists = 'append', index = False, chunksize=20000)
except: raise
我的 HAHA 数据库在目录文件夹中有多个模式,其中许多与“SYS”或“_SYS”相关。我创建了一个单独的架构来测试我的代码并在其中使用,它与我的用户名同名。
我的问题是这样的:1) 有没有一种更有效的方法可以将数据从 MySQL 加载到 Hana,而无需使用 CSV 文件之类的中介,或者在我的情况下是 Pandas Dataframe。使用 VS Code 完成脚本大约需要 90 秒,以及 2) 使用 sqlalchemy-hana 连接器时,它如何知道创建表并将数据存储/附加到哪个模式?自述文件并没有真正解释。幸运的是,它将它存储在正确的模式中(使用我的用户名的模式),但我创建了另一个作为测试,当然该表没有显示在该模式下。如果我尝试在 create_engine 行中这样指定数据库:
engine = create_engine('hana://username:password@host:port/Username')
我收到此错误:TypeError: connect() got an unexpected keyword argument 'database'。
另外,我注意到如果我要运行我的脚本两次并计算创建的表中的行数,它会将行添加两次 - 本质上是创建重复项。正因为如此,3)使用pyhdb包迭代抛出Dataframe的行并一一插入行会更好吗?
非常感谢任何建议/建议/答案!谢谢!
【问题讨论】:
标签: python mysql sqlalchemy hana