首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UcanAccess检索存储的查询sql

UcanAccess检索存储的查询sql
EN

Stack Overflow用户
提问于 2017-10-03 18:27:17
回答 1查看 894关注 0票数 2

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

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

当UCanAccess加载时,它成功地加载了查询:

代码语言:javascript
复制
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控制台上有一个查询,如

代码语言:javascript
复制
SELECT * FROM JEFF_TEST;

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

我尝试了一些东西,包括从python脚本中进行的这个可怕的查询,甚至使用了sysSchema=True选项(从这里:queries.html):

代码语言:javascript
复制
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,并且可以成功地从access检索元数据和数据。我只需要把问题也提出来。

如果有人能给我指明正确的方向,我会很感激的。Windows不是一个可行的选择。

干杯,赛斯

代码语言:javascript
复制
***********************************
* 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())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-04 04:47:29

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

代码语言:javascript
复制
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()

生产

代码语言:javascript
复制
SQL for query [Jeff_Test]:

SELECT Invoice.InvoiceNumber, Invoice.InvoiceDate
FROM Invoice
WHERE (((Invoice.InvoiceNumber)>1));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46551099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档