将read_sql与pyODBC连接一起使用到访问数据库是否安全?

时间:2015-01-20 15:54:47

标签: python pandas

我发现尽管只支持sqlite,但pandas.io.sql.read_sql方法可以通过查询Microsoft Access数据库来创建数据帧。

driver_string="DRIVER={Microsoft Access Driver (*.mdb)}"
file_string = "DBQ="+"test.mdb"
connection_string = ";".join([driver_string, file_string])
cnxn = pyodbc.connect(connection_string)
cursor = cnxn.cursor()
df = pd.read_sql("SELECT * FROM testTable", con=cnxn, index_col = ["indexCol"])

我对阅读数据更感兴趣,不太可能回写到数据库。我还使用包含连接的更复杂查询对此进行了测试,但它似乎运行良好。

有人能告诉我这里有危险吗?这似乎比使用SQLAlchemy(它也不支持Access)简单得多。

我很感激任何人的洞察力。

1 个答案:

答案 0 :(得分:2)

要明确,read_sql在使用DBAPI连接对象时才正式支持sqlite,使用sqlalchemy引擎时,read_sql支持所有可以提供sqlalchemy引擎的数据库(PostgreSQL,MySQL, SQL Server,Oracle,..等等,请参阅http://docs.sqlalchemy.org/en/rel_0_9/dialects/index.html)。

但确实,虽然只有sqlite被官方支持,但它也适用于其他数据库。目前,sqlite后备的实现仅依赖于conn.cursor()cursor.execute()方法以及cursor.fetchmany()cursor.fetchall()方法的可用性。 因此,只要您的连接对象提供这些(并且如果它符合DBAPI2,它将会),这将起作用。

虽然将来很可能不会改变,但不能保证(它仅针对sqlite3进行了测试)。请注意,有一个sqlalchemy访问项目(https://bitbucket.org/zzzeek/sqlalchemy-access),但最近似乎没有引起太多关注(另见connecting sqlalchemy to MSAccess)。

对于read_sql,上面的描述是正确的,用to_sql写入访问数据库肯定不会起作用(这实际上只适用于sqlite3,因为实现依赖于更多sqlite3特定的东西)。