使用许多 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
重新排序它们。
我想一次从单个数据库中的 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
重新排序它们。