web-dev-qa-db-ja.com

InterfaceError(0、 '')

Djangoを使用してサイトを構築しました。クエリを実行しようとすると、この迷惑なエラーが表示されます。

Apacheサーバーを再起動すると、エラーは少しの間消えます。

Traceback:
File "/usr/local/lib/python2.7/site-packages/Django/core/handlers/base.py" in get_response
100.                     response = callback(request, *callback_args, **callback_kwargs)
File "/home/fran/cron/views/set_caches.py" in set_caches
24.         cursor.execute(query, [category['id']])
File "/usr/local/lib/python2.7/site-packages/Django/db/backends/util.py" in execute
15.             return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/site-packages/Django/db/backends/mysql/base.py" in execute
86.             return self.cursor.execute(query, args)
File "build/bdist.linux-i686/Egg/MySQLdb/cursors.py" in execute
155.         charset = db.character_set_name()

Exception Type: InterfaceError at /blablabla/
Exception Value: (0, '')
48
Marian

これは、グローバルカーソルが原因です。生のクエリが必要な各メソッド内でカーソルを作成して閉じてみてください。

cursor = connection.cursor()
cursor.execute(query)
cursor.close()
59
scum

db.close()呼び出しがあり、後で新しい接続を作成せずにデータベースにアクセスしようとすると、このエラーが発生します。意図しないときにデータベースへの接続を閉じたかどうかを確認してください。

40
Moberg

私はモーバーグに同意しました。このエラーは、接続を閉じた後にデータベースにアクセスしようとしたときに発生します。これは、コード内の誤ったインデントが原因である可能性があります。以下は私のコードです。

conn = connect()
cur = conn.cursor()
tk = get_tickers(cur)
for t in tk:
    prices = read_price(t, cur)
    if prices != None:
        update_price(t, cur)
        print 'Price after update of ticker ', t, ':'
        p_open, p_high, p_low, p_close = read_price(t, cur)
        print p_open, p_high, p_low, p_close
    else:
        print 'Price for ', t, ' is not available'
    conn.close()

マリアンが報告したのと同じエラーが出ました。 conn.close()をデデントした後、すべてがうまくいきました。グローバル接続は問題ではないことを確認しました。

3
Toàn Nguyễn

これはグローバルカーソルが原因であることが確認できます。グローバルカーソルは後でいくつかの関数で使用されます。私の症状はまったく同じでした。Apacheの再起動によって一時的に解消される断続的なインターフェイスエラーです。

from Django.db import connection
cursor = connection.cursor() # BAD

def foo():
    cursor.execute('select * from bar')

ただし、Oracle 11.2でDjangoを使用しているため、これはMySQL/pythonドライバーのバグとは思わない。これはおそらく、Apache/mod_wsgiによって行われるキャッシュによるものです。

2
Patrick

python 3.7およびMysql 2.7を使用して、2019年4月と同じ問題が発生しました。

断続的な間隔で、文字列(0、 '')がSQLステートメントにランダムに追加され、エラーが発生します。データベース接続のクローズについてコメントし、コード全体でカーソルのクローズを残すことで、この問題を解決しました。

def set_db():
    db = pymysql.connect(Host='localhost',
                         user="root",
                         passwd="root",
                         db="DATABASE")
    return db


def execute_sql(cnx, sql_clause, fetch_all):

    if sql_clause and sql_clause is not None:
        try:
            cnx.execute(sql_clause)
        except Exception as e:
            print("Error in sql: " + sql_clause + str(e))
            return 0
            pass

        if fetch_all:
            result = cnx.fetchall()
        else:
            result = cnx.fetchone()

        return result
    else:
        print("Empty sql.")
        return 0

db = set_db()
cnx = db.cursor()
sql = "SELECT * FROM TABLE"
result = execute_sql(cnx, sql, 1)
cnx.close() #close the cursor
#db.close #do not close the db connection

...

1
FelipeGTX