【问题标题】:UcanAccess retrieve stored query sqlUcanAccess 检索存储的查询 sql
【发布时间】:2018-03-15 00:50:13
【问题描述】:

我正在尝试检索构成 Access 数据库中存储查询的 SQL。

我正在使用 UcanAccess 4.0.2、jaydebeapi 和 ucanaccess 控制台的组合。最终目标是能够在没有用户干预的情况下从 python 脚本执行以下操作。

UCanAccess 加载时,成功加载查询:

Please, enter the full path to the access file (.mdb or .accdb): /Users/.../SnohomishRiverEstuaryHydrology_RAW.accdb
Loaded Tables:
Sensor Data, Sensor Details, Site Details
Loaded Queries:
Jeff_Test
Loaded Procedures:

Loaded Indexes:
Primary Key  on Sensor Data Columns: (ID) 
, Primary Key  on Sensor Details Columns: (ID) 
, Primary Key  on Site Details Columns: (ID) 
, Index on Sensor Details Columns: (SiteID) 
, Index on Site Details Columns: (SiteID) 

UCanAccess>

当我运行时,来自 UCanAccess 控制台的查询类似于

SELECT * FROM JEFF_TEST;

我得到了预期的查询结果。

即使使用 sysSchema=True 选项(来自此处:http://www.sqlquery.com/Microsoft_Access_useful_queries.html),我也在 python 脚本中尝试了包括这个可怕的查询在内的事情:

SELECT DISTINCT MSysObjects.Name,
   IIf([Flags]=0,"Select",IIf([Flags]=16,"Crosstab",IIf([Flags]=32,"Delete",IIf
   ([Flags]=48,"Update",IIf([flags]=64,"Append",IIf([flags]=128,"Union",
   [Flags])))))) AS Type
   FROM MSysObjects INNER JOIN MSysQueries ON MSysObjects.Id =
   MSysQueries.ObjectId;

但是得到一个对象没有找到或者权限不足的错误。

此时,我已经尝试了 mdbtools,并且可以成功地检索元数据,并从访问中检索数据。我也只需要把查询拿出来。

如果有人能指出我正确的方向,我将不胜感激。 Windows 不是一个可行的选择。

干杯,赛斯

***********************************
* SOLUTION
***********************************

from jpype import *
startJVM(getDefaultJVMPath(), "-ea", "-Djava.class.path=/Users/seth.urion/local/access/UCanAccess-4.0.2-bin/ucanaccess-4.0.2.jar:/Users/seth.urion/local/access/UCanAccess-4.0.2-bin/lib/commons-lang-2.6.jar:/Users/seth.urion/local/access/UCanAccess-4.0.2-bin/lib/commons-logging-1.1.1.jar:/Users/seth.urion/local/access/UCanAccess-4.0.2-bin/lib/hsqldb.jar:/Users/seth.urion/local/access/UCanAccess-4.0.2-bin/lib/jackcess-2.1.6.jar")

conn = java.sql.DriverManager.getConnection("jdbc:ucanaccess:///Users/seth.urion/PycharmProjects/pyAccess/FE_Hall_2010_2016_SnohomishRiverEstuaryHydrology_RAW.accdb")

for query in conn.getDbIO().getQueries():
    print(query.getName())
    print(query.toSQLString())

【问题讨论】:

    标签: python-3.x ms-access ucanaccess jpype jaydebeapi


    【解决方案1】:

    如果您能找到从 Python 中调用 Java 方法的令人满意的方法,那么您可以使用 Jackcess Query#toSQLString() 方法来提取 SQL 以保存查询。例如,我刚刚让它在 Jython 下工作:

    from java.sql import DriverManager
    
    
    def get_query_sql(conn, query_name):
        sql = ''
        for query in conn.getDbIO().getQueries():
            if query.getName() == query_name:
                sql = query.toSQLString()
                break
        return sql
    
    
    # usage example
    if __name__ == '__main__':
        conn = DriverManager.getConnection("jdbc:ucanaccess:///home/gord/UCanAccessTest.accdb")
        query_name = 'Jeff_Test'
        query_sql = get_query_sql(conn, query_name)
        if query_sql == '':
            print '(Query not found.)'
        else:
            print 'SQL for query [%s]:' % (query_name)
            print
            print query_sql
        conn.close()
    

    生产

    SQL for query [Jeff_Test]:
    
    SELECT Invoice.InvoiceNumber, Invoice.InvoiceDate
    FROM Invoice
    WHERE (((Invoice.InvoiceNumber)>1));
    

    【讨论】:

    • 找到一种令人满意的方式来调用 Java 方法是很棘手的。我选择了jpype。一旦我设法用正确的类路径启动我的 jvm,它就像一个魅力。太感谢了!我已将解决方案代码添加到我的问题中,供任何发现此问题并认为它有用的人使用。
    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多