没有。有标准的 SQL 语言,但这个标准只说明了SELECT
,INSERT
等等应该如何工作。没有什么关于.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)