mysql 正在寻找一种更复杂的方法来访问数据库

k75qkfdt  于 2023-03-11  发布在  Mysql
关注(0)|答案(6)|浏览(125)

我有一堆python方法遵循以下模式:

def delete_session(guid):
    conn = get_conn()
    cur = conn.cursor()

    cur.execute("delete from sessions where guid=%s", guid)

    conn.commit()
    conn.close()

有没有一种更Python的方法来执行原始sql。每个方法开头和结尾的两行代码开始让我烦恼。
我不是在寻找一个orm,我想坚持使用原始sql。

9lowa7mx

9lowa7mx1#

您可以编写上下文管理器并使用with语句。例如,请参见this blog post (archived)
python文档中也有一个非常符合你需要的示例,请参见本页的8.1节,特别是开头的片段:

db_connection = DatabaseConnection()
with db_connection as cursor:
    cursor.execute('insert into ...')
    cursor.execute('delete from ...')
    # ... more operations ...
91zkwejq

91zkwejq2#

注意execute,第二个参数必须是[guid](只有一个项目的列表)至于你的问题,我通常只使用封装连接和游标的类,但看起来您可能更喜欢使用 * 执行上下文 *对象,其__enter__方法在__leave__提交或回滚时提供游标,具体取决于终止是正常的还是异常的;这会使你的代码

def delete_session():
    with get_cursor() as cur:
        cur.execute(etc etc)

如果你喜欢这种风格,告诉我们,我将告诉你如何编写get_cursor,其他人无疑会建议用装饰器来代替,所以你可以这样写:

@withcursor
def delete_session(cur):
    cur.execute(etc etc)

但我认为这使得提交/回滚等问题变得有点模糊。2不过,如果你喜欢这样做,请再次告诉我们,我也可以向你展示如何编写该表单。

7jmck4yq

7jmck4yq3#

“我有很多Python方法都遵循以下模式:“
这是令人困惑的。
要么你有一堆函数,要么你有一个类的一堆方法。

函数束

换做这个。

class SQLFunction( object ):
    def __init__( self, connection ):
        self.connection = connection
    def __call__( self, args=None ):
        self.cursor= self.connection.cursor()
        self.run( args )
        self.cursor.commit()
        self.cursor.close()

class DeleteSession( SQLFunction ):
    def run( self, args ):
        self.cursor.execute( "statement" )

delete_session = DeleteSession( connection )

你的函数声明长了两行,但本质上是一样的。你可以使用func1( args ),因为它是一个可调用的对象。程序的其余部分应该保持不变。

一个类中的方法束

class SomeClass( object ):
    def __init__( self, connection ):
        self.connection= connection
    def sql_execute( self, statement, args= None )
        self.cursor= self.connection.cursor() 
        self.cursor.execute( statement, args if args is not None else [] )
        self.connection.commit()
        self.cursor.close()
    def delete_session( self ):
        self.sql_execute( "statement" )

所有方法都可以类似于delete_session,并使用一个公共的sql_execute方法。

iibxawm4

iibxawm44#

它不需要更像Python,只要更有结构:

def execSql(statement):
    conn = get_conn()
    cur = conn.cursor()
    cur.execute(statement)
    conn.commit()
    conn.close()

def delete_session(guid):
    execSql("delete from sessions where guid=%s"%(guid))
jchrr9hc

jchrr9hc5#

装修师?

class SqlExec:
   def __init__ (self, f):
      self.f = f
   def __call__ (self, *args):
      conn = get_conn() 
      cur = conn.cursor()
      cur.execute(self.f (*args))
      conn.commit()
      conn.close()

@SqlExec
def delete_session(guid):
      return "delete from sessions where guid=%s" % guid
x759pob2

x759pob26#

根据这些文档,如果您使用的是SQLite3,您甚至不需要Cursor,正如这些文档所说,Cursor“通常是多余的”。
相反,您可以直接在连接对象上使用快捷方法executeexecutemanyexecutescript

import sqlite3

persons = [
    ("Hugo", "Boss"),
    ("Calvin", "Klein")
    ]

con = sqlite3.connect(":memory:")

# Create the table
con.execute("create table person(firstname, lastname)")

# Fill the table
con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)

# Print the table contents
for row in con.execute("select firstname, lastname from person"):
    print row

print "I just deleted", con.execute("delete from person").rowcount, "rows"

相关问题