为什么我的连接对象突然变成了主要的游标对象?
why is my connection object suddenly a cursor object in the main?
PyMySQL==0.9.2
python3.6.4
我稍微简化了我的代码,它应该在许多 sql 数据库上 运行。我目前的挣扎是 pymysql 和 mysql。
主要的:
$>猫testje.py
#!/usr/bin/env python
import pymysql as dbdr
from dbconnections import mysql as dbc
with dbc.connect(dbdr) as conn:
print(conn)
$>cat dbconnections/mysql.py
def connect(db):
dbc = db.connect(host='127.0.0.1', user='cistats', password='bloemkool',
db='mysql', port=int(3306)
# cursorclass=pymysql.cursors.DictCursor
)
print(dbc)
return dbc
输出:
$>./testje.py
<pymysql.connections.Connection object at 0x10a72e5c0>
<pymysql.cursors.Cursor object at 0x10b16cfd0>
说明在connect函数中dbc是一个Connection对象。
为什么它在 main 中神奇地显示为 Cursor 对象?
我怎样才能解决这个问题?在 main 中,我真的很期待一个 Connection 对象。
对于 cx_Oracle、psycopg2 和 pytds 驱动程序,相同的结构工作正常。
正如 Ignacio Vazquez-Abrams 所提到的,原因是在使用 with
时调用了 connect().enter() 。其他驱动程序也是如此,但其他驱动程序只有:
def __enter__(self):
return self
并且 pymysql 有:
def __enter__(self):
"""Context manager that returns a Cursor"""
return self.cursor()
所以我将我的代码简单地更改为:conn = dbc.connect(...)
现在它适用于我目前使用的所有驱动程序。
PyMySQL==0.9.2 python3.6.4 我稍微简化了我的代码,它应该在许多 sql 数据库上 运行。我目前的挣扎是 pymysql 和 mysql。 主要的: $>猫testje.py
#!/usr/bin/env python
import pymysql as dbdr
from dbconnections import mysql as dbc
with dbc.connect(dbdr) as conn:
print(conn)
$>cat dbconnections/mysql.py
def connect(db):
dbc = db.connect(host='127.0.0.1', user='cistats', password='bloemkool',
db='mysql', port=int(3306)
# cursorclass=pymysql.cursors.DictCursor
)
print(dbc)
return dbc
输出: $>./testje.py
<pymysql.connections.Connection object at 0x10a72e5c0>
<pymysql.cursors.Cursor object at 0x10b16cfd0>
说明在connect函数中dbc是一个Connection对象。 为什么它在 main 中神奇地显示为 Cursor 对象? 我怎样才能解决这个问题?在 main 中,我真的很期待一个 Connection 对象。
对于 cx_Oracle、psycopg2 和 pytds 驱动程序,相同的结构工作正常。
正如 Ignacio Vazquez-Abrams 所提到的,原因是在使用 with
时调用了 connect().enter() 。其他驱动程序也是如此,但其他驱动程序只有:
def __enter__(self):
return self
并且 pymysql 有:
def __enter__(self):
"""Context manager that returns a Cursor"""
return self.cursor()
所以我将我的代码简单地更改为:conn = dbc.connect(...)
现在它适用于我目前使用的所有驱动程序。