使用许多 connection.cursor()

Using many connection.cursor()

我想一次从单个数据库中的 3 个表中获取数据。我用了 3 conn.cursor() ..有什么复杂的方法吗?

            conn = psycopg2.connect(database="plottest", user="postgres")
            self.statusbar.showMessage("Database opened Sucessfully", 1000)
            cur = conn.cursor()
            cur1 = conn.cursor()
            cur2 = conn.cursor()
            cur.execute("SELECT id ,actual  from \"%s\" " % date)
            rows = cur.fetchall()
            cur1.execute("SELECT qty from DAILY where date = \'%s\'" % date)
            dailyqty = cur1.fetchone()
            cur2.execute("SELECT qty from MONTHLY where month = \'%s\'" % month)
            monthqty = cur2.fetchone()   

你可以合并

SELECT a1 FROM t1 WHERE b1 = 'v1';

SELECT a2 FROM t2 WHERE b2 = 'v2';

像这样的单个语句:

SELECT t1.a1, t2.a2 FROM t1, t2
   WHERE t1.b1 = 'v1' AND t2.b2 = 'v2';

假设两个查询 return 恰好一行。

Awoogah awoogah,SQL 注入警告! 不要使用字符串插值编写代码。如果有人使用 "date" ');-- DROP TABLE DAILY;-- 调用您的代码会怎样?

使用绑定参数。总是。

唯一的例外是动态标识符,就像上面的情况一样,您似乎使用了以当前日期命名的 table。在这种情况下,您 必须 "double quote" 它们并将任何包含的双引号加倍。在您的情况下,这意味着 date 应该是 date.replace('"', '""'),您将其替换为 SQL.


现在,回到我们的常规节目。

因为您从每个游标 fetchall 可以重新使用它。您不需要每次都使用新游标。

如果需要,您还可以将每日和每月统计数据与 UNION ALL 结合起来。我在此过程中修复了您的大小写和参数绑定:

cur.execute("""SELECT 1, qty FROM daily WHERE date = %s
               UNION ALL
               SELECT 2, qty FROM monthly WHERE month = %s
               ORDER BY 1""",
            (date, month))

请注意,未使用字符串插值,而是将参数的二元组传递给 psycopg2 以直接绑定。参数周围不需要引号,psycopg2 会根据需要添加它们。

这通过捆绑两个查询避免了客户端-服务器往返。额外的列 andORDER BY 是技术上需要的,因此您可以安全地假设第一行是每日结果,第二行是每月结果。实际上 PostgreSQL 不会用 UNION ALL 重新排序它们。