可能重复:
如何从"Bobby Tables"XKCD漫画中注入SQL?
https://stackoverflow.com/search?q=sql+injection
有人可以解释SQL注入吗?它是如何导致漏洞的?注入SQL的确切位置在哪里?
我正在寻找将数百万个元组批量插入数据库的最有效方法.我正在使用Python,PostgreSQL和psycopg2.
我创建了一个很长的郁金香列表,应该插入到数据库中,有时使用几何修饰符Simplify.
这种天真的方式是使用字符串格式化INSERT语句列表,但我还读到了其他三种方法:
pyformat绑定样式进行参数化插入executemany在元组列表中使用,和COPY.似乎第一种方式是最有效的,但我很感激您的见解和代码片段告诉我如何正确地做到这一点.
我正在尝试学习用Python编程.我想把csv文件放到数据库中.使用它是个好主意
我正在使用python和sql数据库的第一步,仍然不确定使用哪个包以及如何使用.我有一个大约300k字典的列表,每个字典大约有20个键.这些dicts应插入SQL表中.
在我看来,dict方法列表的优点是,我明确地命名了我想要输入特定值的列.(可能是,这不是一个好方法)
让我提出一个更具体的例子来捕捉我的问题的基本要素.该表由三列组成:ID(整数),Price(十进制),Type(字符串).Type支持空值.
我的dict的键具有相同的名称,而dicts列表可能如下所示:
lst = [{'ID':1, 'Price': '9.95', 'Type': None},
{'ID':2, 'Price': '7.95', 'Type': 'Sports'},
{'ID':3, 'Price': '4.95', 'Type': 'Tools'}, ...]
Run Code Online (Sandbox Code Playgroud)
所以出现的问题如下:
我想插入多行并使用asyncpg获取ID,我发现了两种方法:1:生成这样的sql
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy')
RETURNING id;
Run Code Online (Sandbox Code Playgroud)
2:在for循环中使用prepared语句
values =(('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'))
stmnt = connection.prepare("INSERT INTO films (code, title, did, date_prod, kind) VALUES $1, $2, $3, $4, $5 RETURNING id")
for val in values:
stmnt.fetchval(*val)
Run Code Online (Sandbox Code Playgroud)
哪种方式我必须更喜欢100x次700,000行,或者有一些方法来结合这些方法?我完全是绿色的,所以在我身上扔一些烤肉
我正在从几张 csv 表中读取数据。经过一些转换后,我尝试将数据写入 MySQL 数据库。我构建原始 SQL插入语句并使用 sqlalchemy.text() 来处理字符串转义问题。逐行写入效果很好,但我必须插入很多行,因此,我想构造一个原始的批量插入语句。完整的简化版本可以在最后找到。简而言之,对于以下逐行 python 插入片段,我希望有一个相当于使用原始 SQL和sqlalchemy.text()进行批量插入的东西进行批量插入的东西。
逐行文本插入:
for row in rows:
stm = text("INSERT INTO scrapping_data.foo (id, sheet, some_text) VALUES (:id,:sheet,:some_text)").\
bindparams(id=row["id"], sheet=row["sheet"],some_text=row["some_text"])
with engine.connect() as connection:
connection.execute(stm)
Run Code Online (Sandbox Code Playgroud)
等效语句的Python代码:
INSERT INTO scrapping_data.foo (id, sheet, some_text) VALUES (1,'sheet1','Lorem ipsum dolor sit amet'), (2,'sheet2','Lorem ipsum dolor sit amet')
Run Code Online (Sandbox Code Playgroud)
我的代码的完整简化版本:
在 MySQL 中创建表
CREATE TABLE foo (
id INT,
sheet VARCHAR(255),
some_text TEXT,
PRIMARY KEY (id, sheet)
);
Run Code Online (Sandbox Code Playgroud)
在Python中插入脚本
from sqlalchemy import …Run Code Online (Sandbox Code Playgroud) 我有 500K 行我想使用 SQLAlchemy 插入到 PostgreSQL 中。
为了速度,我使用session.bulk_insert_mappings().
通常,我会将插入内容分成较小的批次以最大程度地减少session簿记。但是,bulk_insert_mappings()使用dicts并绕过了许多传统的会话簿记。
如果我将插入分成较小的离散批次,比如每 10K 行插入一次,我仍然会看到速度提高吗?
如果是这样,我应该在每 10K 行之后关闭 PG 事务,还是一直保持打开状态?
我正在阅读这个问题:psycopg2:用一个查询插入多行,我发现其中有一个很好的答案,用于cursor.mogrify加速一系列 sql 插入。这让我想知道,是否cursor.mogrify成功逃脱了所有sql注入漏洞?
Alex Riley发布的答案的代码如下:
args_str = ','.join(cur.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s,%s)", x) for x in tup)
cur.execute("INSERT INTO table VALUES " + args_str)
Run Code Online (Sandbox Code Playgroud)
有谁知道这种使用psychopg2方法cursor.mogrify然后在函数中进行字符串插值的方法有什么漏洞吗cursor.execute?
我正在尝试使用元组元组一次更新多行.我想出了如何从这篇文章构建sql语句,但实现它psycopg2已被证明更具挑战性.这就是我所拥有的:
c = db.cursor()
new_values = (("Richard",29),("Ronald",30))
sql = """UPDATE my_table AS t
SET name = e.name
FROM (VALUES %s) AS e(name, id)
WHERE e.id = t.id;"""
c.execute(sql, (new_values,))
Run Code Online (Sandbox Code Playgroud)
结果是错误:ProgrammingError: table "e" has 1 columns available but 2 columns specified
这是因为该FROM子句被解释为:
FROM (VALUES (("Richard",29),("Ronald",30)))
Run Code Online (Sandbox Code Playgroud)
代替:
FROM (VALUES ("Richard",29),("Ronald",30))
Run Code Online (Sandbox Code Playgroud)
我可以通过执行以下操作解决此问题但似乎不安全:
import re
c = db.cursor()
sql = """UPDATE my_table AS t
SET name = e.name
FROM (VALUES %s) AS e(name, id)
WHERE e.id = …Run Code Online (Sandbox Code Playgroud) 我需要打开许多 XML 文件,然后进行处理以生成大量行,然后将这些行插入到远程 Postgress 数据库中的多个表中。
为了提取 XML 数据,我使用它xml.etree.ElementTree来解析 XML 树并根据需要提取元素。当我做很多事情时,基本操作是获取特定元素(无论是字符串还是整数)并将其放入多个字典之一中。
经过更多处理后,我需要将许多字典插入到数据库中。对于任何单个 xml 文件,我可能会在 3 个表中生成最多 8-10,000 行(或查询)。
在测试时,我输出到 sql 文件,然后手动运行查询。如果我有很多 xml 文件,这显然是行不通的。
因此,我尝试使用psycopg2自动化这个过程。据我了解,从堆栈溢出和其他地方运行单个execute 函数的速度非常慢。基于此 stackoverflow 问题,我尝试编写如下代码:
QueryData = ','.join(cur.mogrify('(%s,%s,%s)', row) for row in myData)
cur.execute('INSERT INTO DBTABLE' + QueryData)
cur.commit()
Run Code Online (Sandbox Code Playgroud)
其中myData是一个元组列表[(a,b,c),(a,b,c),(a,b,c)...],其内容是由我提取的数据xml.etree.ElementTree和我自己计算的值的组合。
当我尝试实际执行上面的代码时,我收到以下错误:
TypeError: sequence item 0: expected str instance, bytes found
好的...如果我然后尝试将我的数据(每个元组元素)转换为str()我得到的结果:
TypeError: encoding without a string argument
Run Code Online (Sandbox Code Playgroud)
我的做法是完全错误的吗?我怎样才能做我需要的事情?我正在使用Python3。
额外的
我被要求展示一个数据示例。
这是最简单的,将 3 个整数值放入一个表中。它的形式如下:(document_id,item_index,item_code) …
python ×9
postgresql ×6
psycopg2 ×3
sql ×3
sqlalchemy ×3
python-3.x ×2
asyncpg ×1
bulkinsert ×1
database ×1
mysql ×1
security ×1
xml-parsing ×1