2

私は Python 3.3、pypyodbc 1.2.1、および Flexquarters QODBC バージョン 14 経由でアクセスできる Quickbooks Enterprise 12 会社ファイルを使用しています。問題なく、期待どおりの結果が得られます。

実行でハードコーディングされた電子メール アドレスに注意してください。これは期待どおりに機能します。

def get_customer_id(search_col,search_str):
    '''(str,str) --> str

    >>>get_customer_id(email, foo@foo.com)
    80000001-1385782702
    '''
    cur.execute("SELECT listid FROM CUSTOMER WHERE email='foo@foo.com'")
    for row in cur.fetchall():
        for field in row: 
            return field

pypyodbc のドキュメントから読み取っているパラメーターを使用して同じことを実行しようとすると、エラーがスローされます。引用符とパラメーター マーカーに問題があると思います。

def get_customer_id(search_col,search_str):
    '''(str,str) --> str

    >>>get_customer_id(email, foo@foo.com)
    80000001-1385782702
    '''
    cur.execute("SELECT listid FROM CUSTOMER WHERE email=?",(search_str,))
    for row in cur.fetchall():
        for field in row: 
            return field

よりpythonisticになろうとしていますか?関数を再利用して、さまざまな列を検索したいと本当に思っています。何かのようなもの:

cur.execute("SELECT listid FROM CUSTOMER WHERE search_str=search_col")

私は他のいくつかのスレッドを見てきましたが、それらのほとんどは、検索する列ではなく、パラメーターを扱っているようです。誰でも私がこれを学ぶのを手伝ってくれますか?

PSはトレースバックを含めるのを忘れました:

Traceback (most recent call last):
  File "C:\Users\Mike\Documents\Projects\qb_sync\quickbooks.py", line 32, in <module>
    print(get_customer_id('email','foo@foo.com'))
  File "C:\Users\Mike\Documents\Projects\qb_sync\quickbooks.py", line 27, in get_customer_id
    cur.execute("SELECT listid FROM CUSTOMER WHERE email=?",[search_str,])
  File "C:\Python\lib\site-packages\pypyodbc.py", line 1457, in execute
    self._BindParams(param_types)
  File "C:\Python\lib\site-packages\pypyodbc.py", line 1420, in _BindParams
    check_success(self, ret)
  File "C:\Python\lib\site-packages\pypyodbc.py", line 982, in check_success
    ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
  File "C:\Python\lib\site-packages\pypyodbc.py", line 960, in ctrl_err
    raise Error(state,err_text)
pypyodbc.Error: ('HY004', '[HY004] [Microsoft][ODBC Driver Manager] SQL data type out of range')
[Finished in 1.7s]
4

3 に答える 3

3

の使用だと思います

cur.execute("""SELECT listid FROM CUSTOMER WHERE ?=?""",[column, email])

pypyodbc やその他の odbc インターフェイスではなく、データベース エンジンでは受け入れられません。列名にパラメーターを使用するためのクエリを受け入れることを拒否するのは、データベース エンジンです。

おそらく、関数を再利用するには、代わりにこれを試す必要があります。

# First construct your dynamic query for the targeted column
sql = """SELECT listid FROM CUSTOMER WHERE %s=?""" %(column) 

# Then provide the dynamic value for the dynamic query string
cur.execute(sql, (value,))
于 2013-12-02T07:30:53.730 に答える