📜  Python Psycopg – 游标类

📅  最后修改于: 2022-05-13 01:54:47.720000             🧑  作者: Mango

Python Psycopg – 游标类

游标类使Python脚本能够使用数据库会话来运行 PostgreSQL 命令。连接类是创建游标的原因。

cursor() 方法:它们永久连接到连接,并且所有指令都在连接所覆盖的数据库会话的上下文中运行。从同一连接生成的游标没有分开,这意味着一个游标对数据库所做的任何更改对其他游标都是不可见的。根据连接的绝缘位置,可以隔离或不隔离由单独连接制成的光标。

游标不是线程安全的,多线程应用程序可以从单个连接构造多个游标,并且每个游标应由单个线程使用。

创建一个简单的光标:

在下面的代码中,我们与“Hospital_database”建立了一个连接,并使用 connection.cursor() 方法创建了一个游标。

Python3
# importing packages
import psycopg2
  
# forming the connection
conn = psycopg2.connect(
    database="Hospital_database", user='postgres',
    password='pass', host='127.0.0.1', port='5432'
)
  
# Setting auto commit to True
conn.autocommit = True
  
# Creating a cursor object using the
# cursor() method
cursor = conn.cursor()


Python3
sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)


Python3
# executing the sql statement
cursor.executemany("INSERT INTO classroom VALUES(%s,%s,%s)", 
                   values)


Python3
sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)
  
# fetching all the rows
results = cursor.fetchall()
print(results)


Python3
sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)
  
# fetching one row
result = cursor.fetchone()
  
print(result)


Python3
sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)
  
# fetching first two rows
result = cursor.fetchmany(2)
  
print(result)


Python3
# cursor.mogrify() to insert multiple values
args = ','.join(cursor.mogrify("(%s,%s,%s)", i).decode('utf-8')
                for i in values)


Python3
# importing packages
import psycopg2
  
# establishing connection
conn = psycopg2.connect(
    database="Employee_db", user='postgres',
    password='root', host='localhost', port='5432'
)
  
# setting autocommit to True
conn.autocommit = True
  
# creating a cursor
cursor = conn.cursor()
  
sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)
  
# fetching all the rows
results = cursor.fetchall()
print(results)
  
# committing changes
conn.commit()
  
# closing connection
conn.close()


游标类中的方法

执行()方法:

准备一个数据库操作并运行它(查询或命令)。参数可以以系列或映射的形式提供,它们将与操作中的变量相关联。位置 (%s) 或命名 (% (name)s) 占位符用于指定变量。

该方法没有返回任何内容。

例子:

Python3

sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)

executemany() 方法:

构建一个数据库操作(查询或命令)并针对一系列参数中的所有参数元组或映射运行它。该函数对于数据库更新指令特别有用,因为它会丢弃查询产生的任何结果集。

例子:

Python3

# executing the sql statement
cursor.executemany("INSERT INTO classroom VALUES(%s,%s,%s)", 
                   values)

fetchall() 方法:

查询结果的所有(剩余)行都被提取并作为元组列表返回。如果没有更多记录要获取,则返回一个空列表。

例子:

Python3

sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)
  
# fetching all the rows
results = cursor.fetchall()
print(results)

输出:

fetchone() 方法:

如果查询结果集的下一行可用,则返回单个元组,如果没有更多数据可用,则返回 None。

例子:

Python3

sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)
  
# fetching one row
result = cursor.fetchone()
  
print(result)

输出:

fetchmany() 方法:

从查询结果中获取下一组行后返回元组列表。如果没有更多行可用,则返回一个空白列表。

该参数指定要获取每个调用的行数。如果未指定,游标的数组大小指定要获取的行数。该过程应尝试检索大小参数指定的行数。

例子:

下面的示例是获取前两行。

Python3

sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)
  
# fetching first two rows
result = cursor.fetchmany(2)
  
print(result)

输出:

callproc() 方法:

使用存储数据库过程的名称来调用它。过程期望的每个参数都必须在参数序列中具有自己的条目。该调用返回输入序列的更改副本作为结果。输入参数保持不变,而输出参数可能会被新值替换。

mogrify() 方法:

绑定参数后,将返回一个查询字符串。如果您使用 execute() 方法或类似方法,返回的字符串与发送到数据库的字符串相同。

例子:

Python3

# cursor.mogrify() to insert multiple values
args = ','.join(cursor.mogrify("(%s,%s,%s)", i).decode('utf-8')
                for i in values)

关闭()方法:

用于关闭光标。从此时起,光标将无法操作;如果使用光标执行任何操作,则会引发 InterfaceError。

让我们看下面的例子来看看光标对象的完整工作

与“Employee_db”数据库建立连接。使用 conn.cursor() 方法创建游标,使用 execute() 方法执行 select SQL 语句,并使用 fetchall() 方法获取 Table 的所有行。

Python3

# importing packages
import psycopg2
  
# establishing connection
conn = psycopg2.connect(
    database="Employee_db", user='postgres',
    password='root', host='localhost', port='5432'
)
  
# setting autocommit to True
conn.autocommit = True
  
# creating a cursor
cursor = conn.cursor()
  
sql = '''SELECT * FROM employee;'''
  
# executing the sql command
cursor.execute(sql)
  
# fetching all the rows
results = cursor.fetchall()
print(results)
  
# committing changes
conn.commit()
  
# closing connection
conn.close()

输出: