【问题标题】:Sqlalchemy core - dynamic SQL query and escaping valuesSqlalchemy 核心 - 动态 SQL 查询和转义值
【发布时间】:2015-10-29 15:05:45
【问题描述】:

我正在创建一个动态插入查询。

    sql = "INSERT INTO `" + self.db_name + "` ("
    sql += ','.join(e.db_name for e in self.fields)
    sql += ") VALUES ("
    sql += ','.join(("'" + e.value + "'") for e in self.fields)
    sql += ");"
    result = s.execute(sql)

它工作正常,除了插入的值对特殊字符和 SQL 注入不安全。

我无法使用 SqlAlchemy text() 机制,因为我不知道表中字段的名称或数量。

我尝试了 MySQLdb.escape_string(),但它不适用于 Unicode。

如何在转义 unicode 值中的特殊字符的同时进行动态 sql 插入查询?

【问题讨论】:

  • 如果您缩进使用 SQLAlchemy,这是 错误 方法。你有 SQLAlchemy 模型类吗?您可以动态使用它们。如果你不这样做,你也可以即时生成 SQLAlchemy 模型:docs.sqlalchemy.org/en/rel_1_0/orm/extensions/automap.html
  • 您可能会使用table()column(),它们是TableColumn 的轻量级类似物,但这有点像XY 问题。为什么不知道他们的表名等?

标签: python python-2.7 sqlalchemy flask-sqlalchemy


【解决方案1】:

4年前想听的答案——

sql = 'INSERT INTO some_table (guid, name) VALUES (:guid_val, :name_val)'

db_session.execute(sql, {
  "guid_val": uuid.uuid4(),
  "name_val": "Hello world"
})

【讨论】:

  • 你能详细说明为什么这是正确的方法吗?这就像为 Sqlalchemy 准备的语句吗?这是否与 values = {"guid_val": uuid.uuid4(), "name_val": "Hello World"} sql = some_table.insert() sql.insert({**values}) 使用 sqlalchemy 核心相同吗?跨度>
  • 如果你想做简单的 INSERT - 使用 sql.insert() 比我的回答更好。 4 年前我的问题是关于构建具有许多未知数的安全自定义查询。主要问题是SQL注入。使用参数化执行比仅仅用值构造一个 SQL 字符串并执行它要安全得多。
猜你喜欢
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多