如何在python中的不同数据库上运行.sql文件

如何在python中的不同数据库上运行.sql文件,python,sql,sql-server,oracle,sqlalchemy,Python,Sql,Sql Server,Oracle,Sqlalchemy,这就是我的要求。我曾经使用python模块在不同的平台(如linux和windows)上的不同数据库(如oracle、MSSQL、db2等)上执行.sql文件。在我的要求中,我无法打开sql文件并运行每个命令。我必须整体运行.sql文件。我读过关于sql炼金术的书,但它似乎必须执行每一条语句。那么是否有任何模块可以运行完整的.sql文件 PS:-我有关于每个数据库的.sql文件,也就是说,如果我有针对oracle的abc.sql,那么每个语句都可以在oracle数据库上运行,如果这个abc.sq

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


PS:-我有关于每个数据库的.sql文件,也就是说,如果我有针对oracle的abc.sql,那么每个语句都可以在oracle数据库上运行,如果这个abc.sql文件不应该在MSSQL或DB2上运行,我的程序将不会在这些数据库上执行它。

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

简而言之:似乎不可能为每个数据库执行这样的程序

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

编辑:

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


您是否能够运行本机工具,例如
sqlplus
psql
?是的,我能够运行本机工具。我也只考虑本机工具的编程,但是,我对本机工具与同一数据库的不同版本的兼容性有一些疑问。例如,我当前的程序适用于oracle 11g,但不适用于oracle 8.1。另外,经过一些研究,我发现MSSQL需要不同的本地客户机才能使用不同的DB版本。您在这方面有什么解决方案吗?您是否生成这样的.sql文件?如果是这样的话,那么在unix环境中使用第一行,但使用SQL注释(
-!/usr/bin/program\u处理我的文件),或者最好添加特殊注释,显示该文件的版本。是的,我们生成了这样的SQL文件,但是我没有得到编写这样的注释的好处。实际上,我们以xml格式创建了关于.sql文件的信息,我的程序将这些信息存储在字典中。我使用不同版本的PostgreSQL。我有
psql
的最新版本,有
psql91
的9.1版本,有
psql92
的9.2版本等等。只需通过制作适当的链接、脚本、批处理等来准备环境。
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)