开发者社区> 问答> 正文

为什么CLASSPATH在Python上失败但在RazorSQL上有效?

在Windows Server 2016上,我们尝试通过JDBC与Jython脚本进行连接,但出现以下错误:

java.lang.ClassNotFoundException:java.lang.ClassNotFoundException:com.microsoft.sqlserver.jdbc.SQLServerDriver

使用以下设置,在同一台计算机上的RazorSQL连接没有错误:

Driver Class: com.microsoft.sqlserver.jdbc.SQLServerDriver 
Driver Location: \Program Files (x86)\RazorSQL\drivers\sqlserver\sqljdbc.jar

结果,我们使用以下命令将CLASSPATH设置为相同的位置:

set CLASSPATH=C:\Program Files (x86)\RazorSQL\drivers\sqlserver\sqljdbc.jar ...但是运行下面的代码时-我们仍然会遇到相同的ClassNotFound错误。

这是我们的Python代码:

jclassname = "com.microsoft.sqlserver.jdbc.SQLServerDriver" 
database = "our_database_name"
db_elem = ";databaseName={}".format(database) if database else ""
host = "###.##.###.###" # ip address
port = "1433"
    
user = "user_name"
    
password = "password"
  

url = (
    jdbc:sqlserver://{host}:{port}{db_elem}"
        ";user={user};password={password}".format(
host=host, port=port, db_elem=db_elem,
  er=user, password=password)
    )
    
print url
    
  
driver_args = [url]
   
jars = None
  
libs = None
 
db = jaydebeapi.connect(jclassname, driver_args, jars=jars,
libs=libs)

这是我们运行Python脚本的方式:

C:\jython2.7.0\bin\jython.exe C:\path_to_our_script.py RazorSQL的连接状况如何-但Python无法做到这一点?我们如何清除此CLASSPATH错误?

展开
收起
祖安文状元 2020-01-05 14:59:19 283 0
1 条回答
写回答
取消 提交回答
  • 您必须在运行时使用系统Classloader加载JAR。

    请参考此答案。

    以下代码段摘自该 Gist。

    def loadJar(jarFile):
        '''load a jar at runtime using the system Classloader (needed for JDBC)
    
        adapted from http://forum.java.sun.com/thread.jspa?threadID=300557
        Author: Steve (SG) Langer Jan 2007 translated the above Java to Jython
        Reference: https://wiki.python.org/jython/JythonMonthly/Articles/January2007/3
        Author: seansummers@gmail.com simplified and updated for jython-2.5.3b3+
    
        >>> loadJar('jtds-1.3.1.jar')
        >>> from java import lang, sql
        >>> lang.Class.forName('net.sourceforge.jtds.jdbc.Driver')
        <type 'net.sourceforge.jtds.jdbc.Driver'>
        >>> sql.DriverManager.getDriver('jdbc:jtds://server')
        jTDS 1.3.1
        '''
        from java import io, net, lang
        u = io.File(jarFile).toURL() if type(jarFile) <> net.URL else jarFile
        m = net.URLClassLoader.getDeclaredMethod('addURL', [net.URL])
        m.accessible = 1
        m.invoke(lang.ClassLoader.getSystemClassLoader(), [u])
    
    if __name__ == '__main__':
        import doctest
        doctest.testmod()
    
    

    也请看-https:

    2020-01-05 14:59:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Data Pre-Processing in Python: 立即下载
Python系列直播第一讲——Python中的一切皆对象 立即下载
From Python Scikit-Learn to Sc 立即下载