我有一个相当大的pandas dataframe - 50左右标题和几十万行数据 - 我希望使用该ceODBC模块将这些数据传输到数据库.以前我pyodbc在for循环中使用并使用了一个简单的execute语句,但是这个时间非常长(每10分钟1000条记录)......
我现在正在尝试一个新的模块,我正在尝试介绍,executemany()虽然我不太确定参数序列的含义是什么:
cursor.executemany("""insert into table.name(a, b, c, d, e, f)
values(?, ?, ?, ?, ?), sequence_of_parameters)
Run Code Online (Sandbox Code Playgroud)
它应该看起来像一个通过每个标题的常量列表
['asdas', '1', '2014-12-01', 'true', 'asdasd', 'asdas', '2',
'2014-12-02', 'true', 'asfasd', 'asdfs', '3', '2014-12-03', 'false', 'asdasd']
Run Code Online (Sandbox Code Playgroud)
或者需要什么格式?
作为另一个相关的问题,我怎样才能将常规的pandas数据帧转换为这种格式?
谢谢!
我不能确定生成的ID是否是连续的,如果没有,是否还有其他方法可以获得它们?
class BaseDao(object):
def __init__(self,pooldb):
self.pooldb = pooldb
def insertmany(self,sql,args):
conn,cur = None,None
try:
conn = pooldb.dedicated_connection()
cur = conn.cursor()
num=cur.executemany(sql,args)
if num <= 0:
raise Exception("insert failure with num equals zero")
lastrowid = int(cur.lastrowid)
return [range(lastrowid - num + 1,lastrowid+1)]
except:
conn.rollback()
traceback.print_exc()
raise Exception("error happened when insert sql=%s args=%s " % (sql,str(args)))
finally:
if cur:
cur.close()
if conn:
conn.close()
Run Code Online (Sandbox Code Playgroud) 我试图使用executemany函数从一行中的所有行中获取一些WHERE约束
import sqlite3
con = sqlite3.connect('test.db')
cur = con.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS Genre (id INTEGER PRIMARY KEY, genre TEXT NOT NULL)')
values = [
(None, 'action'),
(None, 'adventure'),
(None, 'comedy'),
]
cur.executemany('INSERT INTO Genre VALUES(?, ?)', values)
ids=[1,2]
cur.executemany('SELECT * FROM Genre WHERE id=?', ids)
rows = cur.fetchall()
print rows
Run Code Online (Sandbox Code Playgroud)
cur.executemany('SELECT * FROM Genre WHERE id=?', ids)
sqlite3.ProgrammingError: You cannot execute SELECT statements in executemany()
Run Code Online (Sandbox Code Playgroud) 我最近开始学习Python和SQL并且有一个问题.
使用Python和SQLite3我编写了以下代码:
# Use sqlite3 in the file
import sqlite3
# Create people.db if it doesn't exist or connect to it if it does exist
with sqlite3.connect("people.db") as connection:
c = connection.cursor()
# Create new table called people
c.execute("""CREATE TABLE IF NOT EXISTS people(firstname TEXT, lastname TEXT, age INT, occupation TEXT)""")
people_list = [
('Simon', 'Doe', 20, 'Python Master'),
('John', 'Doe', 50, 'Java Master'),
('Jane', 'Doe', 30, 'C++ Master'),
('Smelly', 'Doe', 2, 'Shower Master')
]
# Insert dummy data into …Run Code Online (Sandbox Code Playgroud) 我正在使用Python及其MySQLdb模块将一些测量数据导入Mysql数据库.我们拥有的数据量非常高(目前大约有250 MB的csv文件,还有很多其他文件).
目前我使用cursor.execute(...)导入一些元数据.这不是问题,因为这些只有少数条目.
问题是,当我尝试使用cursor.executemany()导入更大量的实际测量数据时,MySQLdb提出了一个问题.
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)
我目前的代码是
def __insert_values(self, values):
cursor = self.connection.cursor()
cursor.executemany("""
insert into values (ensg, value, sampleid)
values (%s, %s, %s)""", values)
cursor.close()
Run Code Online (Sandbox Code Playgroud)
where values是一个元组列表,每个元组包含三个字符串.任何想法可能有什么问题吗?
编辑:
这些值由.生成
yield (prefix + row['id'], row['value'], sample_id)
Run Code Online (Sandbox Code Playgroud)
然后一行读入一个列表,其中行为和迭代器来自csv.DictReader.
在sqlite3的客户端CLI中,有".import文件TABLE_name"来执行此操作.
但是,我现在不想在我的服务器上安装sqlite3.
在python sqlite3模块中,我们可以创建和编辑数据库.
但是,除了逐行插入行之外,我还没有找到将数据文件导入TABLE的方法.
还有其他方法吗?
我当前正在运行一个脚本,使用“执行多个”函数将值(元组列表)插入到 MySQL 数据库中。当我使用少量行(`1000)时,脚本运行良好。
当我使用大约 40,000 行时,我收到以下错误:
cursor.executemany( stmt, trans_frame)
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2538, in run_code
exec code_obj in self.user_global_ns, self.user_ns
File "<ipython-input-1-66b44e71cf5a>", line 1, in <module>
cursor.executemany( stmt, trans_frame)
File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 253, in executemany
r = self._query('\n'.join([query[:p], ',\n'.join(q), query[e:]]))
File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 346, in _query
rowcount = self._do_query(q)
File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 310, in _do_query
db.query(q)
OperationalError: (2006, 'MySQL server has gone away')
Run Code Online (Sandbox Code Playgroud)
有什么建议么?
在查看 Stack Exchange 提供的一些 websocket 方法时,我想将一些数据点保存到 MySQL 数据库中。但是,当我尝试运行命令时executemany,出现以下错误:
_mysql_exceptions.OperationalError: (1241, 'Operand should contain 1 column(s)')
在环顾四周时,我发现了许多此错误的例子,但他们已经处理了删除SELECT语句中的括号的问题。我没有使用SELECT. 我正在尝试INSERT。
我的代码的一个简短的包含示例如下所示:
import MySQLdb as mdb
db = mdb.connect(host='localhost',user='myuser',db='qs',passwd='mypass',use_unicode=True,charset='utf8')
cur = db.cursor()
db_qry = """INSERT IGNORE INTO questions (id, site_base, title, body_sum, tags, last_act_dt, url, owner_url, owner, api_site) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
parms = [(u'mathematica.stackexchange.com',
43248,
u'How to plot “Normalized distance” in this problem',
u"Problem: there are two particles whose equationsof motion both satisfy -n Abs[x[t]]^n/x[t] == x''[t]. …Run Code Online (Sandbox Code Playgroud) 我正在使用 pyodbc 中的 (executemany) 函数将数据填充到 mssql 数据库中。这是我的代码:
def populate_database(conn):
tuples = [
('2020-04-13 00:50:42', 'AirShoppingRQ', 'ALEY', '2020-05-23', '', '', 'BRU-BLQ', ''),
('2020-04-13 00:50:43', 'AirShoppingRQ', 'ALEY', '2021-01-23', '', '', 'LIS-STO', '')
]
query_string = 'INSERT INTO mytable VALUES (?,?,?,?,?,?,?,?)'
cursor = conn.cursor()
#cursor.fast_executemany = True
cursor.executemany(query_string, tuples)
cursor.commit()
Run Code Online (Sandbox Code Playgroud)
它工作正常,但如果我取消注释该行cursor.fast_executemany = True,则会出现以下错误:
('22018', '[22018] [Microsoft][ODBC Driver 17 for SQL Server]Invalid character value for cast specification (0) (SQLExecute)')
Run Code Online (Sandbox Code Playgroud)
下面是我的表:
CREATE TABLE [dbo].[mytable](
[field1] [datetime] NULL,
[field2] [varchar](50) NULL,
[field3] [varchar](20) NULL, …Run Code Online (Sandbox Code Playgroud) 我试图使用列表作为值的来源将数据插入Access mdb文件.
cursor.execute("select * from Components")
cursor.executemany("""
INSERT INTO Components
([Database Number],Description, [Warehouse Code],[Supplier Code], Usage, Major1, Minor1)
VALUES (?,?,?,?,?,?,?)
"""), input_list
cursor.commit()
Run Code Online (Sandbox Code Playgroud)
我得到错误"TypeError:function需要2个参数(给定1个)".错误是指行"""),input_list
我做错了什么?在此先感谢您的帮助.
这是input_list的打印
['7', '1/2" PVC 90° Elbow', '406-005', 'SUP2', 'Y', 'PVC FS', 'PVC FS']
['7', '3/4" PVC 90° Elbow', '406-007', 'SUP2', 'Y', 'PVC FS', 'PVC FS']
['7', '1" PVC 90° Elbow', '406-010', 'SUP2', 'Y', 'PVC FS', 'PVC FS']
['7', '1.25" PVC 90° Elbow', '406-012', 'SUP2', 'Y', 'PVC FS', 'PVC FS']
['7', '1.5" PVC 90° Elbow', '406-015', …Run Code Online (Sandbox Code Playgroud) executemany ×10
python ×9
mysql ×3
sqlite ×3
mysql-python ×2
pyodbc ×2
database ×1
for-loop ×1
import ×1
pandas ×1
select ×1
sql ×1
sql-server ×1