Python MySql插入不起作用

Posted

技术标签:

【中文标题】Python MySql插入不起作用【英文标题】:Python MySql Insert not working 【发布时间】:2011-08-27 00:04:50 【问题描述】:

我正在使用 python mysql API 从 python 程序连接到 Mysql 数据库。我从几天开始就面临一个问题。我无法将记录插入数据库并且不知道是什么原因。这是我将记录连接并插入数据库的方式。

db = MySQLdb.connect("localhost","root","padmaramulu","pdfsearch" )
cursor = db.cursor()
#cursor.execute("""CREATE TABLE IF NOT EXISTS documents (docid INT NOT NULL ,PRIMARY KEY(docid),docname CHAR(30)) engine=innodb""")
temp = "hello";number = 2;
cursor.execute( 'insert into documents(docid,docname) values("%d","%s")' % (number,temp) )
db.close()

为什么会这样?

【问题讨论】:

您应该标记解决了您的问题的答案。写下该答案的人将获得当之无愧的加分,读者将立即知道该解决方案已被应用并有效。 【参考方案1】:

在关闭连接之前,你应该添加db.commit()

【讨论】:

您也可以在脚本开始时使用 db.autocommit(True)。因为 MySQLdb 从 1.2.0 开始禁用自动提交 非常感谢 .. 非常有帮助 @SRC 虽然您的解决方案确实有效,但它仅在开发时使用。在生产环境中,您应该始终管理自己的事务 谢谢先生!在我读到这篇文章之前,我一直在挠头。非常感谢! db.autocommit(True) 为我工作,但 db.commit 没有......直到......我意识到我输入了 db.commit 而不是 db.commit() 我忘记了括号最后——我真是个傻瓜【参考方案2】:

如果你在 MySQL 中使用 InnoDB 引擎,你应该添加

db.commit() 

否则将您的 MySQL 引擎更改为 MyISAM 无需更改代码中的任何内容。

【讨论】:

【参考方案3】:

也许有人遇到了同样的问题,也许这有帮助,

任意 2 个选项:

一个。对于使用 MySqldb 的人:

db.commit() 

b.对于使用 Mysql 连接器的人:

cnx.commit()

在关闭 db 或 Mysql 连接器之前添加此代码:

一个。示例:(Azure)

import mysql.connector
from mysql.connector import errorcode

# Obtain connection string information from the portal
config = 
  'host':'<mydemoserver>.mysql.database.azure.com',
  'user':'<myadmin>@<mydemoserver>',
  'password':'<mypassword>',
  'database':'<mydatabase>',
  'client_flags': [ClientFlag.SSL],
  'ssl_cert': '/var/wwww/html/DigiCertGlobalRootG2.crt.pem'


# Construct connection string
try:
   conn = mysql.connector.connect(**config)
   print("Connection established")
except mysql.connector.Error as err:
  if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    print("Something is wrong with the user name or password")
  elif err.errno == errorcode.ER_BAD_DB_ERROR:
    print("Database does not exist")
  else:
    print(err)
else:
  cursor = conn.cursor()

  # Drop previous table of same name if one exists
  cursor.execute("DROP TABLE IF EXISTS inventory;")
  print("Finished dropping table (if existed).")

  # Create table
  cursor.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")
  print("Finished creating table.")

  # Insert some data into table
  cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("banana", 150))
  print("Inserted",cursor.rowcount,"row(s) of data.")
  cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("orange", 154))
  print("Inserted",cursor.rowcount,"row(s) of data.")
  cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("apple", 100))
  print("Inserted",cursor.rowcount,"row(s) of data.")

  # Cleanup
  conn.commit()
  cursor.close()
  conn.close()
  print("Done.")

b.示例:(Dev Mysql)

from __future__ import print_function
from datetime import date, datetime, timedelta
import mysql.connector

cnx = mysql.connector.connect(user='scott', database='employees')
cursor = cnx.cursor()

tomorrow = datetime.now().date() + timedelta(days=1)

add_employee = ("INSERT INTO employees "
               "(first_name, last_name, hire_date, gender, birth_date) "
               "VALUES (%s, %s, %s, %s, %s)")
add_salary = ("INSERT INTO salaries "
              "(emp_no, salary, from_date, to_date) "
              "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)")

data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14))

# Insert new employee
cursor.execute(add_employee, data_employee)
emp_no = cursor.lastrowid

# Insert salary information
data_salary = 
  'emp_no': emp_no,
  'salary': 50000,
  'from_date': tomorrow,
  'to_date': date(9999, 1, 1),

cursor.execute(add_salary, data_salary)

# Make sure data is committed to the database
cnx.commit()

cursor.close()
cnx.close()

【讨论】:

【参考方案4】:

我认为你的代码应该修复

cursor.execute( 'insert into documents(docid,docname) values(%d, %s)', (number,temp) )

然后你应该在关闭数据库连接之前添加db.commit()

【讨论】:

【参考方案5】:

您可以像这样设置 python 自动提交数据库中的更改:

db = MySQLdb.connect("localhost","root","padmaramulu","pdfsearch, autocommit=True")```

【讨论】:

以上是关于Python MySql插入不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MySql - 触发器不起作用 - 中止插入

插入触发器后MySQL不起作用

插入带有参数MYSQL的存储过程不起作用

PHP- MySQL 数据库插入操作不起作用 [重复]

如果不存在,mysql插入不起作用创建重复键

PHP MySql PDO 多次插入不起作用