如何使用robotframework数据库库将utf8字符插入到oracle数据库中

时间:2015-08-31 11:40:58

标签: sql database utf-8 robotframework

我有一个机器人脚本,它从sql文件中插入一些sql语句;其中一些语句包含utf8字符。如果我使用navicat工具手动将此文件插入数据库,一切都很好。但是当我尝试使用机器人框架的数据库库来执行这个文件时,utf8字符会变得疯狂!

这是我的utf8包含的sql语句:

INSERT INTO "MY_TABLE" VALUES (2, 'تست1');

这是我使用数据库库的方式:

Connect To Database Using Custom Params     cx_Oracle   ${dbConnection}
Execute Sql Script      ${sqlFile}
Disconnect From Database

这是我在数据库中得到的:

������������ 1

我试图直接使用cx_Oracle执行SQL文件但它仍然失败!似乎原始库中存在问题。这是我用于导入SQL文件的内容:

import cx_Oracle
if __name__ == "__main__":
    dsn_tns = cx_Oracle.makedsn(ip, port, sid)
    db = cx_Oracle.connect(username, password, dsn_tns)
    sql_commands = open(sql_file_addr, 'r').read().split(";")
    cr = db.cursor()
    for command in sql_commands:
        if not command in ["", "\t", "\n", "\r", "\n\r", "\r\n", None]:
            print "Executing SQL command:", command
            cr.execute(command)

    db.commit()

我发现我可以在连接字符串中定义字符集。我已经为mysql数据库完成了它,框架成功地将UTF8字符插入到数据库中;这是我的MySQL连接字符串:

database='db_name', user='db_username', password='db_password', host='db_ip', port=3306, charset='utf8'

但我不知道如何为Oracle连接字符串定义字符集。我试过这个:

'db_username','db_password','db_ip:1521/db_sid','utf8'

我有这个错误:

TypeError: an integer is required

3 个答案:

答案 0 :(得分:4)

正如@Yu Zhang建议的那样,我在这篇link中阅读了讨论,我发现我应该设置一个环境变量NLS_LANG,以便与数据库建立UTF-8连接。所以我在测试设置中添加了以下内容:

os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"

答案 1 :(得分:0)

以下任何链接都有帮助吗?

http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch6unicode.htm#i1006779
http://www.theserverside.com/news/thread.tss?thread_id=39575
https://community.oracle.com/thread/502949

答案 2 :(得分:0)

这里可能有几个问题......

第一个问题可能是您没有使用UTF-8编码保存测试文件。

Robot框架希望使用UTF-8编码保存纯文本测试文件,但大多数文本编辑器默认情况下不会使用UTF-8进行保存。

验证编辑器是否保存了这种方式 - 例如,使用NotePad ++打开文件并选择Encoding - > UTF-8

另一个问题可能是与Oracle数据库的连接。您似乎无法将连接自定义属性配置为显式声明UTF-8

这意味着您可能需要声明数据库架构本身是UTF-8