11. food_query.py python数据库查询
2015-12-10 23:32
701 查看
# -*- coding: cp936 -*-
import sqlite3,sys
#建立数据库的连接及其游标
conn = sqlite3.connect('food.db')
curs = conn.cursor()
#查询
query = 'SELECT * FROM food WHERE %s' % 'kcal <=100 AND fiber >= 10 ORDER BY sugar'
print query
curs.execute(query)
names = [f[0] for f in curs.description]
for row in curs.fetchall():
for pair in zip(names, row):
print '%s: %s' % pair
print
对于这个程序,我有几个问题
1. 原程序query = 'SELECT * FROM food WHERE %s' % 'kcal <=100 AND fiber >= 10 ORDER BY sugar'这行写的是query = 'SELECT * FROM food WHERE %s' % sys.argv[1],我最开始直接run程序,就出现了indexerror: list index out of range。出现这个的问题在于sys.argv[1]没有赋值。
语句$ python food_query 'kcal <=100 AND fiber >= 10 ORDER BY sugar',给sys.argv[1]赋值为'kcal <=100 AND fiber >= 10 ORDER BY sugar'。这样赋值的目的是为了便于修改查询条件,不用每次修改条件都要重写py文档,只需要在执行py的时候赋相应的值。但是$ python貌似是cmd命令啊,在python shell中无法执行。所以我只好把sys.argv[1]直接在py文档中修改成它将要赋的值:'kcal
<=100 AND fiber >= 10 ORDER BY sugar'。
![](https://img-blog.csdn.net/20151210231601763?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
python传递参数只能用命令行么?求解。要想在shell里面直接传参数要怎么做?
解答: python 要给argv传递参数貌似还真只能用cmd命令行;上面那张图出现问题的原因在于python文件中字符串用单引号,但是命令行中是要用双引号的,改成双引号上述问题就解决了。
2. names = [f[0] for f in curs.description] 这句,打印出来的names显示为['id', 'desc', 'water', 'kcal', 'protein', 'fat', 'ash', 'carbs', 'fiber', 'sugar']
而curs.description打印显示为
('id', None, None, None, None, None, None)
('desc', None, None, None, None, None, None)
('water', None, None, None, None, None, None)
('kcal', None, None, None, None, None, None)
('protein', None, None, None, None, None, None)
('fat', None, None, None, None, None, None)
('ash', None, None, None, None, None, None)
('carbs', None, None, None, None, None, None)
('fiber', None, None, None, None, None, None)
('sugar', None, None, None, None, None, None)
为什么会是这样?
3. for row in curs.fetchall(): 这句。curs游标fetch到的row为什么不带id, desc, water这些指标,只有纯数字?
import sqlite3,sys
#建立数据库的连接及其游标
conn = sqlite3.connect('food.db')
curs = conn.cursor()
#查询
query = 'SELECT * FROM food WHERE %s' % 'kcal <=100 AND fiber >= 10 ORDER BY sugar'
print query
curs.execute(query)
names = [f[0] for f in curs.description]
for row in curs.fetchall():
for pair in zip(names, row):
print '%s: %s' % pair
对于这个程序,我有几个问题
1. 原程序query = 'SELECT * FROM food WHERE %s' % 'kcal <=100 AND fiber >= 10 ORDER BY sugar'这行写的是query = 'SELECT * FROM food WHERE %s' % sys.argv[1],我最开始直接run程序,就出现了indexerror: list index out of range。出现这个的问题在于sys.argv[1]没有赋值。
语句$ python food_query 'kcal <=100 AND fiber >= 10 ORDER BY sugar',给sys.argv[1]赋值为'kcal <=100 AND fiber >= 10 ORDER BY sugar'。这样赋值的目的是为了便于修改查询条件,不用每次修改条件都要重写py文档,只需要在执行py的时候赋相应的值。但是$ python貌似是cmd命令啊,在python shell中无法执行。所以我只好把sys.argv[1]直接在py文档中修改成它将要赋的值:'kcal
<=100 AND fiber >= 10 ORDER BY sugar'。
python传递参数只能用命令行么?求解。要想在shell里面直接传参数要怎么做?
解答: python 要给argv传递参数貌似还真只能用cmd命令行;上面那张图出现问题的原因在于python文件中字符串用单引号,但是命令行中是要用双引号的,改成双引号上述问题就解决了。
2. names = [f[0] for f in curs.description] 这句,打印出来的names显示为['id', 'desc', 'water', 'kcal', 'protein', 'fat', 'ash', 'carbs', 'fiber', 'sugar']
而curs.description打印显示为
('id', None, None, None, None, None, None)
('desc', None, None, None, None, None, None)
('water', None, None, None, None, None, None)
('kcal', None, None, None, None, None, None)
('protein', None, None, None, None, None, None)
('fat', None, None, None, None, None, None)
('ash', None, None, None, None, None, None)
('carbs', None, None, None, None, None, None)
('fiber', None, None, None, None, None, None)
('sugar', None, None, None, None, None, None)
为什么会是这样?
3. for row in curs.fetchall(): 这句。curs游标fetch到的row为什么不带id, desc, water这些指标,只有纯数字?
相关文章推荐
- Python对象协议
- 记录解决Python下pip install MySQL-python失败的问题
- 【Python】字符串的换行 和 引入其他py文件
- python 机器学习 scikit-learn 总结与备忘
- Python 多进程开发与多线程开发
- [Python标准库]textwrap——格式化文本段落
- python学习之路之案例3--多级菜单显示城市详细信息
- Python 基础语法(四)
- Python 基础语法(三)
- Python 基础语法(二)
- Python 基础语法(一)
- 最好的Python机器学习库
- python学习之路之案例2---计算器
- python练习2
- python学习日记_第三天(ex6~8)
- python练习1
- python 中__name__ = '__main__' 的作用
- python基础知识--字符串
- python中if __name__ == '__main__': 的解析
- python+Eclipse+pydev环境搭建