在 Python ODBC 中使用 Microsoft Access SQL 运算符
Posted
技术标签:
【中文标题】在 Python ODBC 中使用 Microsoft Access SQL 运算符【英文标题】:Using Microsoft Access SQL operators in Python ODBC 【发布时间】:2010-10-18 05:31:38 【问题描述】:短版:当我尝试通过 ODBC 使用 Access 的 DatePart 功能时,无法解决。
加长版:
我有一个 Microsoft Access 查询,它返回带有时间戳和分数的行。我想按 day 对其进行排序,然后按分数进行排序 - 实际上是当天的高分表。
为了获得更好的功能,我使用DatePart
函数从时间戳中提取年、月和日中的每一个,并在ORDER BY
后面加上分数。
在 Microsoft Access 中,查询效果很好。
但是,当我使用pyodbc
访问相同的查询时,ODBC 驱动程序被 DatePart 函数难住了,并认为它是缺少参数的名称。
令我吃惊的是,即使我隐藏了 DatePart 函数,通过创建一个新的 HighScore 查询然后SELECT * FROM HighScore
,它仍然抱怨它找不到参数。显然,查询的 SQL 在处理过程的后期才得到解决。
我的问题是:
如何解析 SQL 中的 DatePart 函数以允许 Access 运行它,或者 通过 ODBC 按日期部分对时间戳进行排序的正确方法是什么?添加了附加信息:
看起来有点矫枉过正,但这里有一些代码:
import pyodbc
access_db_path = r"<ellided>"
connection_string = 'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ='+access_db_path
connection = pyodbc.connect(connection_string, autocommit = True)
print "First query"
connection.cursor().execute('SELECT ScoreTime FROM SplitExtendedP1')
print "Worked"
print "Second query"
print connection.cursor().execute('SELECT DatePart("yyyy",ScoreTime) FROM SplitExtendedP1')
print "Doesn't get here."
结果如下:
First query
Worked
Second query
Traceback (most recent call last):
File "<ellided>.py", line 16, in <module>
print connection.cursor().execute('SELECT DatePart("yyyy", ScoreTime) FROM SplitExtendedP1')
pyodbc.Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1. (-3010) (SQLExecDirectW)')
【问题讨论】:
您需要提供一些源代码以及您从 pyodbc 获得的确切错误消息。 【参考方案1】:您确定在该 SQL 方言中使用引号 "yyyy"
而不是撇号 'yyyy'
有效吗?
【讨论】:
谢谢。正是问题所在。【参考方案2】:日期时间以浮点数的形式存储在 access 中。小数点左边的数字是日期,小数点右边的小数部分是时间(以一天的小数表示;即,0.5 = 中午)。
如果您想按天排序,您可以简单地使用 Int() 函数返回日期时间字段的整数部分。
【讨论】:
很高兴知道。我可能会恢复到此以使代码更简单。谢谢。 除了让它更简单之外,它还应该让它更快。以上是关于在 Python ODBC 中使用 Microsoft Access SQL 运算符的主要内容,如果未能解决你的问题,请参考以下文章
使用 python ctypes.windll.ODBCCP32.SQLConfigDataSource 添加 ODBC 用户 DSN
不使用 ODBC 将 Python 连接到 SQL Server
通过 ODBC 使用 Python 连接到 MySQL 数据库的问题
在docker中为python项目加载Teradata ODBC驱动程序时出错