Python-MySQLdb 无法插入值,但运行打印到控制台的 SQL 会插入数据?

标签 python mysql sql linux

我写了下面的代码来生成一些测试数据。该脚本无法将数据插入数据库。然而,将生成的 SQL 打印到控制台并将其复制粘贴到 mysql 中会插入记录,这是为什么?

首先,这是 SQLfiddle http://sqlfiddle.com/#!9/cf3bfe/1

下面是脚本:

import MySQLdb
from datetime import *
import random

db1=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")
db2=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")

get_participant=db1.cursor()
insert_test=db2.cursor()

dt = datetime.now()

for y in xrange(0,5):
    for x in xrange(0,440):
        random_dt = dt + timedelta(minutes=random.randrange(15, 30, 1))
        get_participant.execute('''SELECT COUNT(*) FROM Participant WHERE (InternalGroup IS NOT NULL) AND (idParticipant = ''' + str(x + 1) + ''');''')
        row = get_participant.fetchone()
        if row[0] != 0:
            sql2 = 'INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values (\'' + str(random_dt) + '\', \'' + str(x + 1) + '\');'
            insert_test.execute(sql2)
            print sql2

以下是 print sql2 语句在控制台上打印的一些行。完全按原样复制并粘贴这些行,将数据插入数据库

INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:09:46.308746', '243');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:09:46.308746', '244');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:10:46.308746', '245');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:03:46.308746', '255');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:04:46.308746', '266');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 16:58:46.308746', '272');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 16:57:46.308746', '286');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:10:46.308746', '289');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:03:46.308746', '294');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:02:46.308746', '333');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:04:46.308746', '363');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:03:46.308746', '372');
INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values ('2017-10-06 17:05:46.308746', '388');

编辑 1:

我把代码改成了这样:

import MySQLdb
from datetime import *
import random

db1=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")
db2=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")

get_participant=db1.cursor()
insert_test=db2.cursor()

dt = datetime.now()

for y in xrange(0,5):
    for x in xrange(0,439):
        xn = x + 1
        random_dt = dt + timedelta(minutes=random.randrange(15, 30, 1))
        get_participant.execute('''SELECT COUNT(*) FROM Participant WHERE (InternalGroup IS NOT NULL) AND (idParticipant = %s)''', (xn,))
        row = get_participant.fetchone()
        if (row[0] != 0):
            insert_test.execute('''INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values (%s,%s)''', (random_dt, xn))

但是还是没有插入记录。

编辑 2:

在循环内移动游标也没有区别:

db1=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")
db2=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")

dt = datetime.now()

for y in xrange(0,5):
    for x in xrange(0,439):
        get_participant = db1.cursor()
        insert_test = db2.cursor()
        xn = x + 1
        random_dt = dt + timedelta(minutes=random.randrange(15, 30, 1))
        get_participant.execute('''SELECT COUNT(*) FROM Participant WHERE (InternalGroup IS NOT NULL) AND (idParticipant = %s)''', (xn,))
        row = get_participant.fetchone()
        if (row[0] != 0):
            insert_test.execute('''INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values (%s,%s)''', (random_dt, xn))

编辑 3:

忘记提交数据库,将代码更改为以下,现在一切正常:

import MySQLdb
from datetime import *
import random

db1=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")
db2=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")

dt = datetime.now()

for y in xrange(0,5):
    for x in xrange(0,439):
        get_participant = db1.cursor()
        insert_test = db2.cursor()
        xn = x + 1
        random_dt = dt + timedelta(minutes=random.randrange(15, 30, 1))
        get_participant.execute('''SELECT COUNT(*) FROM Participant WHERE (InternalGroup IS NOT NULL) AND (idParticipant = %s)''', (xn,))
        row = get_participant.fetchone()
        if (row[0] != 0):
            insert_test.execute('''INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values (%s,%s)''', (random_dt, xn))
            db2.commit()

最佳答案

:捂脸

忘记使用 db2.commit()

下面的代码 100% 有效

import MySQLdb
from datetime import *
import random

db1=MySQLdb.connect(host="localhost", user="user", passwd="password", db="racedb_bu")
db2=MySQLdb.connect(host="localhost", user="user", passwd="password",, db="racedb_bu")

dt = datetime.now()

for y in xrange(0,5):
    for x in xrange(0,439):
        get_participant = db1.cursor()
        insert_test = db2.cursor()
        xn = x + 1
        random_dt = dt + timedelta(minutes=random.randrange(15, 30, 1))
        get_participant.execute('''SELECT COUNT(*) FROM Participant WHERE (InternalGroup IS NOT NULL) AND (idParticipant = %s)''', (xn,))
        row = get_participant.fetchone()
        if (row[0] != 0):
            insert_test.execute('''INSERT INTO racedb_bu.TimeEntry (DateTimeStamp, Participant) values (%s,%s)''', (random_dt, xn))
            db2.commit()

关于Python-MySQLdb 无法插入值,但运行打印到控制台的 SQL 会插入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46608665/

相关文章:

python - 如何在 Python 中定义数据框?

python - 如何在 python 列表中存储印地语字符?

python - 将带有时区值的日期时间字符串转换为印度标准时间 (IST)

php - 在 PHP 网站中将数据从 Excel 导入到 MySQL

sql - 如何在 sql 中添加外部表中的其他列?

python - 处理字段中使用冒号分隔的对的 CSV

php - 根据工资帽/点找到最佳阵容的公式/类

php - 无法在 Codeigniter 中查看表单页面

sql - CREATE TABLE 语句中缺少右括号

php - 如何从mysql表中获取分数总和