【问题标题】:Incorrect number of rows returned by JOIN query in Python scriptPython 脚本中 JOIN 查询返回的行数不正确
【发布时间】:2015-11-23 00:21:18
【问题描述】:

我用 Python 编写了以下代码,连接到 DB,创建两个表并将它们连接起来。然后它打印JOIN 查询的结果。

问题是行数是 3,虽然我希望得到 2 行。另外,如果我在命令提示符下使用sqlite> 运行相同的查询,那么JOIN 返回的行数是正确的,即2。

import sqlite3 as lite
import pandas as pd

# Connecting to the database. The `connect()` method returns a connection object.
con = lite.connect('getting_started.db')

with con:
    cur = con.cursor()
    cur.execute("DROP TABLE IF EXISTS cities")
    cur.execute("DROP TABLE IF EXISTS weather")

    cur.execute("CREATE TABLE cities (name text, state text)")
    cur.execute("CREATE TABLE weather (city text, year integer, warm_month text, cold_month text, average_high integer)")

    # Filling 'cities' with the data
    cur.execute("INSERT INTO cities VALUES('Washington', 'DC')")
    cur.execute("INSERT INTO cities VALUES('Houston', 'TX')")

    # Filling 'weather' with the data
    cur.execute("INSERT INTO weather VALUES('Washington', 2013, 'July', 'January', 59)")
    cur.execute("INSERT INTO weather VALUES('Houston', 2013, 'July', 'January', 62)")

    # Joining data together
    sql = "SELECT name, state, year, warm_month, cold_month FROM cities " \
          "INNER JOIN weather " \
          "ON name = city"
    cur.execute(sql)

rows = cur.fetchall()
cols = [desc[0] for desc in cur.description]

# Loading data into pandas
df = pd.DataFrame(rows, columns=cols)

for index, row in df.iterrows():
    print("City: {0}, The warmest month: {1}".format(row['name'],row['warm_month']))

在 Python 中,结果是:

City: Washington, The warmest month: July
City: Washington, The warmest month: July
City: Houston, The warmest month: July

但是,在命令提示符下结果不同(正确):

City: Washington, The warmest month: July
City: Houston, The warmest month: July

【问题讨论】:

  • 你能告诉我们它返回的 3 行吗?例如。 print(rows)
  • @Tom Dalton:我更新了帖子,请检查一下。
  • 我注意到的一件事是rows = cur.... 行在with con: 上下文管理器之外。我认为这不会产生影响,但无论如何可能值得修复。
  • 另外,你真的可以print(rows),以及你的原始输出吗?我正在尝试查看错误是否在熊猫的东西中。
  • @Tom Dalton:将 rows=cur... 放入 with 解决了问题。谢谢!

标签: python join sqlite


【解决方案1】:

问题是您的rows = cur.fetchall() 位于con 连接上下文管理器之外,因此当您使用游标并且它的数据库连接已关闭时会发生一些奇怪的事情。

在此处参考文档:https://docs.python.org/2/library/sqlite3.html#using-the-connection-as-a-context-manager 它表明with con: 提供了一个事务,这可能解释了在事务中执行语句但随后尝试在事务之外的结果集上使用游标的奇怪行为。

这对我来说仍然很奇怪,我本以为这种使用会导致 sqllite3 引发异常,告诉您正在发生这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多