python - 如何使用 python 和 mysqldb 创建动态 sql 语句

标签 python mysql

我有以下代码:


    def sql_exec(self, sql_stmt, args = tuple()):
        """
        Executes an SQL statement and returns a cursor.

        An SQL exception might be raised on error

        @return: SQL cursor object
        """
        cursor = self.conn.cursor()
        if self.__debug_sql:
            try:
                print "sql_exec: " % (sql_stmt % args)
            except:
                print "sql_exec: " % sql_stmt

        cursor.execute(sql_stmt, args)
        return cursor

    def test(self, limit = 0):
        result = sql_exec("""
            SELECT
                *
            FROM
                table
            """ + ("LIMIT %s" if limit else ""), (limit, ))
        while True:
            row = result.fetchone()
            if not row:
                break
            print row
        result.close()

我怎样才能很好地编写 test() 使其在有或没有“限制”的情况下都可以工作,而不必编写两个查询?

最佳答案

首先,不要。

不要“即时”构建 SQL。这是一场安全噩梦。它会导致比看起来要解决的问题更多的问题。

其次,阅读 LIMIT 上的 MySQL 页面。他们建议使用大量的数字。

SELECT * FROM tbl LIMIT 18446744073709551615;

将默认值从 0 更改为 18446744073709551615。

如果您不喜欢那样,则使用 if 语句并编写两个版本的 SELECT。从长远来看,最好有两个没有安全漏洞的相似 SELECT 语句。

第三,不要这样测试。

使用单元测试http://docs.python.org/library/unittest.html

关于python - 如何使用 python 和 mysqldb 创建动态 sql 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3351897/

相关文章:

mysql - 无法使用 LOAD DATA 将时间戳加载到 MySQL 表中

mysql - SQL:具有特定值的一行中有多少行

php - 其他时间戳上的 ZF2 内连接

PHP mysqli_query 未显示在数据库中

python - 如何在没有副作用的情况下 pickle 和解 pickle ?

python - 通过替换 pandas 单元格中的第二行,将一列中的值连接到另一列

python - 如何使用 python 正则表达式提取逗号前后的任何单词?

python - extract href scrapy - 爬行但不提取

python - Bash 或 GoogleCL : new line in a string parameter

sql - ACL/权限系统MYSQL数据库设计方法