首页 文章

SQL INSERT使用Jython和zxJDBC具有多行值

提问于
浏览
2

我正在使用 com.ziclix.python.sql 包在Jython中编程到SQL数据库 . 我'm wondering if the package has support in its prepared statements for SQL INSERT/UPDATE statements where you pass multiple rows of values rather than just one row, so that you'在一个INSERT语句中插入多行 . 让我解释 .

这是一个基本的SQL INSERT语句:

INSERT INTO Names (FirstName, LastName) VALUES ("John", "Doe");

使用zxJDBC准备好的语句,这非常简单:

# Assume cursor object
statement = 'INSERT INTO Names (FirstName, LastName) VALUES (?, ?)'
cursor.execute(statement, ('John', 'Doe'))

但是我感兴趣的那种INSERT语句是你插入多行值的地方,如下所示:

INSERT INTO Names (FirstName, LastName) VALUES ("John", "Doe"), ("Mary", "Smith");

有没有办法使用预准备语句来做到这一点?如果可能的话,我宁愿使用预准备语句来构建SQL查询而不是字符串插值 . 谢谢 .

1 回答

  • 2

    由于zxJDBC实现PEP 249 " Python Database API Specification v2.0",您可以使用executemany()方法来完成此任务:

    # Assume cursor object
    statement = 'INSERT INTO Names (FirstName, LastName) VALUES (?, ?)'
    cursor.executemany(statement, (
        ('John', 'Doe'),
        ('Mary', 'Smith'),
        # ...
        )
    )
    

    Update :看起来这个太慢了,因为zxJDBC只是多次调用执行而没有优化查询 . 相反,你可以这样做:

    from itertools import chain
    statement = 'INSERT INTO Names (FirstName, LastName) VALUES {values}'.format(
        values = ','.join('(?, ?)' for _ in input_seq))
    input_seq = (
        ('John', 'Doe'),
        ('Mary', 'Smith'),
        # ...
        )
    cursor.execute(statement, list(chain(*input_seq)))
    

    这确实涉及一些字符串操作,但它保留了参数列表的使用并允许单个DB往返 .

相关问题