0

所以这是我的要求。我有一些使用 python 模块在不同平台(如 linux 和 windows)上执行不同数据库(如 oracle、MSSQL、db2 等)上的 .sql 文件。在我的要求中,我无法打开 sql 文件并运行每个命令。我必须运行整个 .sql 文件。我正在阅读有关 sql alchemy 的信息,但似乎它必须执行每条语句。那么是否有任何模块可以运行完整的 .sql 文件

PS:-我有关于每个数据库的 .sql 文件,即如果我有用于 oracle 的 abc.sql,那么每个语句都兼容在 oracle 数据库上运行,如果这个 abc.sql 文件不应该在 MSSQL 上运行或DB2,我的程序不会在这些数据库上执行它。

4

1 回答 1

1

没有。有标准的 SQL 语言,但这个标准只说明了SELECTINSERT等等应该如何工作。没有什么关于.sql文件的。这样,每个 DBMS 供应商都有自己处理此类文件的方式。在 PostgreSQL 中,您可以轻松地psql将文件作为输入运行命令行程序。在 Oracle 世界中,您可以尝试使用相同的方法sqlplus,但当然这些.sql文件会有所不同。在 PostgreSQL 中,您应该使用其他供应商将报告为错误的非标准 SQL 命令设置输入文件的编码。对于此类事情,Oracle 使用环境设置。使用 Oracle,您的.sql文件sqlplus必须以COMMIT; EXIT;etc 结尾。甚至每个供应商的日期时间字符串文字都不同。MS SQL 使用{ts '...'}不适用于 Informix、PostgreSQL 或 Oracle。

很快:似乎不可能为每个数据库做这样的程序。

您所能做的就是邀请其他层来更改您的标准输入文件(添加一些页眉和页脚,转换日期时间文字等)。然后可以针对数据库供应商提供的命令行工具或能够执行此类转换文件的专用程序运行此类准备好的文件。

编辑:

似乎对于不同的数据库,甚至对于不同的数据库版本,您都有不同的文件。您还可以使用能够运行.sql文件的本机程序。所以唯一的问题是检测数据库和数据库版本并使用适当的本机客户端执行适当的文件。这是 Jython 中的代码(我经常使用 JDBC,但您可以使用 DB-API 和 Python db 驱动程序):

def get_db_version(db):
    dbname = ''
    ver = ''
    c = db.createStatement()
    try:
        rs = c.executeQuery("SELECT FIRST 1 DBINFO('version','full') FROM systables")
        dbname = 'informix'
        # IBM Informix Dynamic Server Version 11.50.FC4
    except:
        try:
            rs = c.executeQuery("SELECT * FROM v$version WHERE banner LIKE 'Oracle%'")
            dbname = 'oracle'
            # Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
        except:
            try:
                rs = c.executeQuery("SELECT version()")
                dbname = 'postgresql'
                # PostgreSQL 9.2.4 on ..., 64-bit
                # PostgreSQL 9.3.0 on ..., 64-bit
            except:
                raise
    if dbname:
        while (rs.next()):
            ver = rs.getString(1)
    return dbname, ver


def select_sql_app_and_file():
    import_app = None
    ver_postfix = ''
    dbname, ver = get_db_version(create_db_connection())
    if dbname == 'postgresql':
        import_app = 'psql'
        if 'PostgreSQL 9.2' in ver:
            import_app = 'psql92'
            ver_postfix = '92'
    elif dbname == 'oracle':
        import_app = 'sqlplus'
        if 'Release 11.' in ver:
            import_app = 'sqlplus11'
            ver_postfix = '11'
    # ...
    sql_file_name = 'import_' + dbname + ver_postfix + '.sql'
    return import_app, sql_file_name


def run_sql_file():
    import_app, sql_file_name = select_sql_app_and_file()
    if import_app:
        execute_import_app(import_app, sql_file_name)
于 2013-09-19T08:16:25.400 回答