我收到了一堆应该在Access数据库中执行的查询,作为我的Python脚本的一部分。不幸的是,直接在MS Access中使用的查询会给出一些输出记录,在Python脚本中不返回任何内容(也没有错误)。与数据库和一般语法的连接应该没问题,因为简单的查询(比如从表中选择一列,哪些东西)工作得很好。以下是包含以下查询之一的代码:
import pyodbc
baza = r"C:\base.mdb"
driver = "{Microsoft Access Driver (*.mdb, *.accdb)}"
access_con_string = r"Driver={};Dbq={};".format(driver, baza)
cnn = pyodbc.connect(access_con_string)
db_cursor = cnn.cursor()
expression = """SELECT F_PARCEL.PARCEL_NR, F_PARCEL_LAND_USE.AREA_USE_CD, F_PARCEL_LAND_USE.SOIL_QUALITY_CD, F_ARODES.TEMP_ADRESS_FOREST, F_SUBAREA.AREA_TYPE_CD, F_AROD_LAND_USE.AROD_LAND_USE_AREA, F_PARCEL.COUNTY_CD, F_PARCEL.DISTRICT_CD, F_PARCEL.MUNICIPALITY_CD, F_PARCEL.COMMUNITY_CD, F_SUBAREA.SUB_AREA
FROM F_PARCEL INNER JOIN (F_PARCEL_LAND_USE INNER JOIN ((F_ARODES INNER JOIN F_AROD_LAND_USE ON F_ARODES.ARODES_INT_NUM = F_AROD_LAND_USE.ARODES_INT_NUM) INNER JOIN F_SUBAREA ON F_ARODES.ARODES_INT_NUM = F_SUBAREA.ARODES_INT_NUM) ON (F_PARCEL_LAND_USE.SHAPE_NR = F_AROD_LAND_USE.SHAPE_NR) AND (F_PARCEL_LAND_USE.PARCEL_INT_NUM = F_AROD_LAND_USE.PARCEL_INT_NUM)) ON F_PARCEL.PARCEL_INT_NUM = F_PARCEL_LAND_USE.PARCEL_INT_NUM
WHERE (((F_ARODES.TEMP_ADRESS_FOREST) Like ?) AND ((F_AROD_LAND_USE.AROD_LAND_USE_AREA)<?) AND ((F_ARODES.TEMP_ACT_ADRESS)= ?))
ORDER BY F_PARCEL.PARCEL_NR, F_PARCEL_LAND_USE.SHAPE_NR;"""
rows = db_cursor.execute(expression, ("14-17-2-03*", 0.0049, True)).fetchall()
for row in rows:
print row
cnn.close()
我知道那些查询是从MS Access中的查询构建器生成的,所以我想知道这可能导致差异,但另一方面,这仍然是访问数据库。
无论如何,问题出现在SQL中,所以我想知道哪些元素可能导致在MS Access中直接执行的查询与pyodbc连接之间的输出不同?
答案 0 :(得分:2)
由于在Access本身运行的查询和从外部应用程序运行的查询之间的LIKE通配符的不同,您将被绊倒。
从Access本身运行查询时,您需要使用星号作为通配符:"14-17-2-03*"
。
从外部应用程序(如Python应用程序)运行查询时,需要使用百分号作为通配符:"14-17-2-03%"
。