PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tạo câu lệnh SQL với python

Tôi biết đây là một câu hỏi cũ, nhưng tôi thường muốn những gì có vẻ như OP muốn:Một thư viện RẤT đơn giản để tạo SQL cơ bản.

Các chức năng dưới đây thực hiện điều đó. Bạn cung cấp cho họ một tên bảng và một từ điển chứa dữ liệu bạn muốn sử dụng và họ trả về truy vấn SQL cho thao tác bạn cần.

Các cặp khóa / giá trị đại diện cho tên trường và giá trị trong các hàng cơ sở dữ liệu.

def read(table, **kwargs):
    """ Generates SQL for a SELECT statement matching the kwargs passed. """
    sql = list()
    sql.append("SELECT * FROM %s " % table)
    if kwargs:
        sql.append("WHERE " + " AND ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
    sql.append(";")
    return "".join(sql)


def upsert(table, **kwargs):
    """ update/insert rows into objects table (update if the row already exists)
        given the key-value pairs in kwargs """
    keys = ["%s" % k for k in kwargs]
    values = ["'%s'" % v for v in kwargs.values()]
    sql = list()
    sql.append("INSERT INTO %s (" % table)
    sql.append(", ".join(keys))
    sql.append(") VALUES (")
    sql.append(", ".join(values))
    sql.append(") ON DUPLICATE KEY UPDATE ")
    sql.append(", ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
    sql.append(";")
    return "".join(sql)


def delete(table, **kwargs):
    """ deletes rows from table where **kwargs match """
    sql = list()
    sql.append("DELETE FROM %s " % table)
    sql.append("WHERE " + " AND ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
    sql.append(";")
    return "".join(sql)

Bạn sử dụng nó như vậy. Chỉ cần đặt tên bảng và từ điển cho nó (hoặc sử dụng tính năng ** kwargs của python):

>>> upsert("tbl", LogID=500, LoggedValue=5)
"INSERT INTO tbl (LogID, LoggedValue) VALUES ('500', '5') ON DUPLICATE KEY UPDATE LogID = '500', LoggedValue = '5';"

>>> read("tbl", **{"username": "morten"})
"SELECT * FROM tbl WHERE username = 'morten';"

>>> read("tbl", **{"user_type": 1, "user_group": "admin"})
"SELECT * FROM tbl WHERE user_type = '1' AND user_group = 'admin';"

Nhưng HÃY CẨN THÊM CÁC KÍCH THƯỚC THUỘC TÍNH CỦA SQL

Hãy xem điều gì sẽ xảy ra khi một người dùng mã độc hại của bạn thực hiện điều này:

>>> read("tbl", **{"user_group": "admin'; DROP TABLE tbl; --"})
"SELECT * FROM tbl WHERE user_group = 'admin'; DROP TABLE tbl; --';"

Thật dễ dàng để tạo ORM tạm thời của riêng bạn nhưng bạn chỉ nhận được những gì bạn thấy - bạn phải tự thoát khỏi đầu vào :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pgbackups trên Heroku không tìm thấy

  2. Postgres SQL để truy vấn văn bản mảng [] trong phần tử cụ thể

  3. Chuỗi UTF-8 tương tự cho trường tự động hoàn thành

  4. PostgreSQL RDS tránh khó mã hóa mật khẩu kết nối khi sử dụng dblink_connect ()

  5. Cập nhật hoặc Chèn (nhiều hàng và cột) từ truy vấn con trong PostgreSQL