我可以在sqlitemanager(firefox插件)中选择一条记录。请查看所选记录的附件。数据库在这里,http://pan.baidu.com/s/1eQ04tlo。 您可以下载它并测试sql语句。
select capital.代码 as code,quote.close as close, quote.close*capital.股份总数/10000 as market_cap,
balance.负债合计/balance.资产总计 as debt_ratio,
profit.归属于母公司所有者的净利润/balance.'所有者权益(或股东权益)合计' as roe,
profit.归属于母公司所有者的净利润/balance.'负债和所有者权益(或股东权益)总计' as roa ,
quote.close*capital.股份总数/profit.归属于母公司所有者的净利润 as pe,
quote.close*capital.股份总数/balance.资产总计 as pb
from profile,capital,quote,balance,profit
where capital.代码=300001
and profile.代码=capital.代码
and profile.代码=quote.code
and profile.代码=balance.代码
and profile.代码=profit.代码
and quote.date="20140523"
and balance.报告日期="20131231"
and profit.报告日期="20131231";
当我用python代码包装它时,我无法获得所选记录,这是什么问题?
# -*- coding: utf-8 -*-
import os,re,sqlite3
db_name='china.sqlite'
target_dir='e:\\workspace\\data\\'
con = sqlite3.connect(target_dir+db_name)
cur=con.cursor()
select_str='''select capital.代码 as code,quote.close as close, quote.close*capital.股份总数/10000 as market_cap,
balance.负债合计/balance.资产总计 as debt_ratio,
profit.归属于母公司所有者的净利润/balance.'所有者权益(或股东权益)合计' as roe,
profit.归属于母公司所有者的净利润/balance.'负债和所有者权益(或股东权益)总计' as roa ,
quote.close*capital.股份总数/profit.归属于母公司所有者的净利润 as pe,
quote.close*capital.股份总数/balance.资产总计 as pb
from profile,capital,quote,balance,profit
where capital.代码=300001
and profile.代码=capital.代码
and profile.代码=quote.code
and profile.代码=balance.代码
and profile.代码=profit.代码
and quote.date='20140523'
and balance.报告日期='20131231'
and profit.报告日期='20131231';'''
cur.execute(select_str)
print(cur.fetchall())
我很难理解code1可以运行,code2无法运行。
CODE1
import os,re,sqlite3
db_name='china.sqlite'
target_dir='e:\\workspace\\data\\'
con = sqlite3.connect(target_dir+db_name)
cur=con.cursor()
select_str='''select capital.代码 as code,quote.close as close, quote.close*capital.股份总数/10000 as market_cap,
balance.负债合计/balance.资产总计 as debt_ratio,
profit.归属于母公司所有者的净利润/balance.'所有者权益(或股东权益)合计' as roe,
profit.归属于母公司所有者的净利润/balance.'负债和所有者权益(或股东权益)总计' as roa ,
quote.close*capital.股份总数/profit.归属于母公司所有者的净利润 as pe,
quote.close*capital.股份总数/balance.资产总计 as pb
from profile,capital,quote,balance,profit
where capital.代码='300001'
and profile.代码='300001'
and quote.code='300001'
and balance.代码='300001'
and profit.代码='300001'
and quote.date='20140523'
and balance.报告日期='20131231'
and profit.报告日期='20131231';'''
cur.execute(select_str)
print(cur.fetchall())
码2
import os,re,sqlite3
db_name='china.sqlite'
target_dir='e:\\workspace\\data\\'
con = sqlite3.connect(target_dir+db_name)
cur=con.cursor()
select_str='''select capital.代码 as code,quote.close as close, quote.close*capital.股份总数/10000 as market_cap,
balance.负债合计/balance.资产总计 as debt_ratio,
profit.归属于母公司所有者的净利润/balance.'所有者权益(或股东权益)合计' as roe,
profit.归属于母公司所有者的净利润/balance.'负债和所有者权益(或股东权益)总计' as roa ,
quote.close*capital.股份总数/profit.归属于母公司所有者的净利润 as pe,
quote.close*capital.股份总数/balance.资产总计 as pb
from profile,capital,quote,balance,profit
where capital.代码=300001
and profile.代码=capital.代码
and profile.代码=quote.code
and profile.代码=balance.代码
and profile.代码=profit.代码
and quote.date='20140523'
and balance.报告日期='20131231'
and profit.报告日期='20131231';'''
cur.execute(select_str)
print(cur.fetchall())
在我看来,cod1在逻辑上等于code2,它们之间没有区别。
之间有区别吗?where capital.代码='300001'
and profile.代码='300001'
and quote.code='300001'
and balance.代码='300001'
and profit.代码='300001'
和
where capital.代码=300001
and profile.代码=capital.代码
and profile.代码=quote.code
and profile.代码=balance.代码
and profile.代码=profit.代码
??
当我引用代码并获得正确的结果时,问题的原因仍然未知。
答案 0 :(得分:1)
我没有下载数据库,因为它大约有250兆字节,而且下载回答一个简单的问题太多了。如果你想让人们下载数据库,我建议创建一个只有几条记录的小型数据库,问题就在那里。
现在找到实际答案:当您在数字300001周围加上引号时,您正在搜索字符串。省略引号时,您正在搜索整数。 The SQLite manual表示整数永远不会与字符串相等(SQLite称之为TEXT值):
INTEGER或REAL值小于任何TEXT或BLOB值。
因此,当您搜索整数时,您的WHERE子句永远不会比较相等,因为实际值是一个字符串。这就是为什么你必须在“300001”周围加上引号才有效。
UPDATE :我的回答的原始版本说“实际值是一个整数”,这是倒退。在查看OP发布的SQLite3数据库之后,我看到“代码”字段(对于那些不读中文的字段,大致翻译为“源代码”)在其模式中被定义为TEXT字段。所以我编辑了我的交换整数和字符串的答案。
更新2 :从您发布的sqlitemanager的屏幕截图中看来,它正在将查询中的整数值转换为字符串,因为它知道SQL模式表示代码field是一个TEXT字段,因此它会为您更正您的查询。 (不应该这样做 - 数字1与字符串“1”不同,除非用户专门要求进行转换,否则不应将其转换为另一个,但这是一个关于糟糕的软件设计的咆哮,这无助于回答你的问题。)所以sqlitemanager的这个“功能”(这真的是一个bug)是在查询中隐藏问题,但是pysqlite3库不会自动转换数据类型等等它暴露了这个问题。
无论sqlitemanager的行为是否正确,问题的解决方案都非常简单:确保在搜索TEXT字段(例如代码)中的值时,为其提供搜索值这是一个用引号括起来的文本字符串。这将在Python和sqlitemanager中随处可用,这就是你想要编写查询的方式。