Din*_* Xu 1 python sqlalchemy mysql-python pandas
我正在使用以下查询从 mysql 数据库读取数据:
设置:
conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='**', passwd='**', db='***')
engine = create_engine('mysql+mysqldb://***')
sql = 'show tables like "{}"'.format('aTable_' + '%')
Run Code Online (Sandbox Code Playgroud)
选项-1:这样就可以了
a1 = pd.read_sql_query(sql, conn)
Run Code Online (Sandbox Code Playgroud)
选项2:这将抛出错误:
ProgrammingError:(MySQLdb.exceptions.ProgrammingError )格式字符串的参数不足[SQL:显示类似“aTable %”的表](此错误的背景位于:http://sqlalche.me/ e/f405 )
a1 = pd.read_sql_query(sql, engine)
Run Code Online (Sandbox Code Playgroud)
如果我想使用第二种风格(引擎作为参数)我该怎么办?
不要使用字符串格式将值传递给 SQL,而是使用占位符:
\n\nfrom sqlalchemy import text\nengine = create_engine(\'mysql+mysqldb://***\')\nsql = text(\'SHOW TABLES LIKE :pattern\')\na1 = pd.read_sql_query(sql, engine, params={\'pattern\': \'aTable_%\'})\nRun Code Online (Sandbox Code Playgroud)\n\n使用text()允许您使用命名的paramstyle,无论使用什么 DB-API 驱动程序。占位符可确保您或其他任何人不会意外地将意外的 SQL 注入到您的查询中,例如传递包含引号的字符串作为值。
在这种情况下,问题就出在%性格上。execute()如果不带参数调用MySQLdb DB-API 驱动程序的方法,则它不会尝试在查询中使用占位符。另一方面,它看起来像 SQLAlchemy 正在传递一个空参数容器,这会触发尝试使用查询字符串中的占位符的代码路径,在将参数转换为 SQL 文字形式后,execute()最终 \xe2\x80\x94 \xe2\x80\x94 是使用 % 格式完成的,因此错误“格式字符串参数不足”:
In [4]: \'show tables like "aTable_%"\' % ()\n---------------------------------------------------------------------------\nTypeError Traceback (most recent call last)\n<ipython-input-4-4f31bc6a7bb6> in <module>()\n----> 1 \'show tables like "aTable_%"\' % ()\n\nTypeError: not enough arguments for format string\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2824 次 |
| 最近记录: |