GVKun编程网logo

如何使用 WHERE 在 python 中更新 sqlite3 记录?

1

本文将带您了解关于如何使用WHERE在python中更新sqlite3记录?的新内容,另外,我们还将为您提供关于android–数据被添加到列表中而不是在addChildEventListener的o

本文将带您了解关于如何使用 WHERE 在 python 中更新 sqlite3 记录?的新内容,另外,我们还将为您提供关于android – 数据被添加到列表中而不是在addChildEventListener的onChildChanged()中更新、go-sqlite3 操作加密的 sqlite3 数据库不加密、mysql - SQLite3 php excel caching method sqlite3 is not availableEOL、Python 中的参数错误,SQLite3 类型错误:+ 不支持的操作数类型:'sqlite3.Cursor' 和 'str'的实用信息。

本文目录一览:

如何使用 WHERE 在 python 中更新 sqlite3 记录?

如何使用 WHERE 在 python 中更新 sqlite3 记录?

如何解决如何使用 WHERE 在 python 中更新 sqlite3 记录?

我正在努力用 python 更新我的 sqlite3 数据库中的记录。 我已尝试遵循此 tutorial 并根据我的需要修改教程中的此函数:

def update_task(conn,task):
    """
    update priority,begin_date,and end date of a task
    :param conn:
    :param task:
    :return: project id
    """
    sql = '''''' UPDATE tasks
              SET priority = ?,begin_date = ?,end_date = ?
              WHERE id = ?''''''
    cur = conn.cursor()
    cur.execute(sql,task)
    conn.commit()

我的桌子是这样设置的:

sql_create_answers_table = """CREATE TABLE IF NOT EXISTS answers (
                                    id integer PRIMARY KEY,predmet text NOT NULL UNIQUE,tag text NOT NULL,keyword text NOT NULL,obsah text NOT NULL,autor text NOT NULL,datum text NOT NULL
                                );"""
db.create_table(sql_create_answers_table)

我的更新函数是这样写的:

def update_answer(answer):
    try:
        conn = create_connection(db_name)
        cur = conn.cursor()
        sql_command = """UPDATE answers 
                        SET predmet = ?,tag = ?,keyword = ?,obsah = ?,autor = ?,datum = ?,WHERE id = ?"""
        # I have also tried this: cur.execute(sql_command,answer )
        cur.execute(sql_command,(answer[1],answer[2],answer[3],answer[4],answer[5],answer[6],answer[0]) )
        conn.commit()                        
        conn.close()
    finally:
        unlock_db()

这是我建立到数据库的连接的方式:

def create_connection(db_file):
    """ create a database connection to an sqlite database """
    conn = None
    try:
        conn = sqlite3.connect(db_file)
        return conn
    except Error as e:
        print(e)

当我在 tkinter 应用程序中调用该函数时,原始答案如下所示:

(1,''pokus'',''žádný'',''datum'',''Text zpravy a ahoj kamo.\\n'',''Vlad'',''02/09/21'')

然后我创建一个新版本的答案,如下所示:

new_answer = (1,''Text\\n'',''02/15/21'') # the 4th field changes

然后调用更新函数(db是我导入的带有该函数的模块):

db.update_answer(new_answer)

我收到一个错误“

File "f:\\AAA Vlada\\a škola\\Python\\zapoctak\\db_module.py",line 135,in update_answer
    cur.execute(sql_command,answer[0]) )
sqlite3.OperationalError: near "WHERE": Syntax error

我的数据库上的其他操作正常工作,我不明白为什么这个简单的更新功能不起作用。 “更新的答案”在我看来是正确的,更新功能也是如此。

我很感激任何帮助,如果需要,我可以提供更多代码。

解决方法

去掉 , 子句前多余的 WHERE 字符,你应该没问题。

android – 数据被添加到列表中而不是在addChildEventListener的onChildChanged()中更新

android – 数据被添加到列表中而不是在addChildEventListener的onChildChanged()中更新

我在firebase中有一些数据在某些特定操作上被更改,我希望在应用程序中显示该更改.

我有一个RecyclerView,其中来自firebase的所有数据都已填充.

这是代码:

    databaseReference.child("uListings").child(Accesstoken.getCurrentAccesstoken().getUserId()).addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                // recyclerview gets populated here
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                if (dataSnapshot.getValue() != null) {
                    Map<String,String> map = (Map<String,String>)dataSnapshot.getValue();
                    Map<ArrayList<String>,ArrayList<String>> map2 = (Map<ArrayList<String>,ArrayList<String>>)dataSnapshot.getValue();
                    String pDescription = map.get("pDescription");
                    String pDuration = map.get("pDuration");
                    String pPrice = map.get("pPrice");
                    String postedAt = map.get("postedAt");
                    String views = map.get("views");
                    ArrayList<String> imageUrl = map2.get("imageUrl");

                            if (imageUrl != null) {
                                UHandler pHandler = new UHandler(imageUrl.get(0), pDescription, pDuration, pPrice, postedAt, views);
                                list.add(pHandler);
                                adapter.notifyDataSetChanged();
                                progressBar.setVisibility(View.INVISIBLE);
                            } else {
                                Toast.makeText(getBaseContext(), "imageUrlNone", Toast.LENGTH_SHORT).show();
                            }

                } else {
                    Log.d("PDPchange", "NULL");
                    progressBar.setVisibility(View.INVISIBLE);
                }
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

这是UHandlerAdapter.java:

public class UHandlerAdapter extends RecyclerView.Adapter<UHandlerAdapter.MyViewHolder> {

    private Context mContext;
    private List<UHandler> listingList;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView pDescription, pDuration, pPrice, postedAt, listingViews, imageUrl;
        public ArrayList<String> imageUrls;
        public CircleImageView pImage;


        public MyViewHolder(View view) {
            super(view);
            pImage = (CircleImageView) view.findViewById(R.id.p_image_profile);
            pDescription = (TextView) view.findViewById(R.id.p_description_profile);
            pDuration = (TextView) view.findViewById(R.id.p_duration_profile);
            pPrice = (TextView) view.findViewById(R.id.p_price_profile);
            postedAt = (TextView) view.findViewById(R.id.p_posted_when_profile);
            listingViews = (TextView) view.findViewById(R.id.listing_views_profile);
            imageUrl = (TextView) view.findViewById(R.id.image_urls_profile);
        }
    }


    public UHandlerAdapter(Context mContext, List<UProfileHandler> listingList) {
        this.mContext = mContext;
        this.listingList = listingList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.profile_all, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        UHandler handler = listingList.get(position);
        holder.pDescription.setText(handler.getPDescriptionProfile());
        holder.pDuration.setText(handler.getPDurationProfile());
        holder.pPrice.setText(handler.getPPriceProfile());
        holder.postedAt.setText(handler.getPostedAt());
        holder.listingViews.setText(handler.getListingViews());

        // loading album cover using Glide library
        Glide.with(mContext)
                .load(handler.getPImageProfile())
                .apply(new RequestOptions().placeholder(R.drawable.ic_placeholder).error(R.drawable.ic_error))
                .into(holder.pImage);

    }

    @Override
    public int getItemCount() {
        return listingList.size();
    }
}

问题是在onChildChanged()中,更改的视图会在列表中添加一个完整的其他项,以反映其更改的值,而不仅仅是在onChildAdded()中先前添加的项中更新.

我怎样才能在以前添加的项目中更新它?

解决方法:

您可以存储密钥以便更新它,例如:

 ArrayList<String> mKeys = new ArrayList<String>();  

databaseReference.child("uListings").child(Accesstoken.getCurrentAccesstoken().getUserId()).addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        // recyclerview gets populated here

                        String key = dataSnapshot.getKey();
                        mKeys.add(key);
                        adapter.notifyDataSetChanged();

                    }

                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                        if (dataSnapshot.getValue() != null) {
                             .......
                             //Now we get the index to update specific value
                              String key = dataSnapshot.getKey();
                              int index = mKeys.indexOf(key);
                              list.set(index, pHandler);

                              adapter.notifyDataSetChanged();
                              ....
                    }

go-sqlite3 操作加密的 sqlite3 数据库不加密

go-sqlite3 操作加密的 sqlite3 数据库不加密

代码如下:建立的数据库并不加密,求解。 

// +build sqlite_userauth

package main

import (
	"database/sql"
	"fmt"
	"strconv"
	"time"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	now_time := time.Now()
	//db, err := sql.Open("sqlite3", "./foo1.db")
	hs := now_time.Format("150405")
	tmp_str := "file:test" + hs + ".s3db?_auth&_auth_user=admin&_auth_pass=admin&_auth_crypt=sha1"
	db, err := sql.Open("sqlite3", tmp_str)
	checkErr(err)
	//查询是否存在数据表
	check_db, err := db.Query("SELECT name FROM sqlite_master WHERE type=''table'' ORDER BY name")
	checkErr(err)

	have_table := 0

	for check_db.Next() {
		var tablename string
		err = check_db.Scan(&tablename)
		checkErr(err)
		fmt.Println("****查询表:")
		fmt.Println(tablename)
		if tablename == "userinfo" {
			have_table = 1
		}

	}
	if have_table == 0 {
		// 创建数据表
		create_db, err := db.Prepare("CREATE TABLE [userinfo]([uid] INTEGER PRIMARY KEY, [username] TEXT, [departname] TEXT, [created] TEXT);")
		checkErr(err)
		_, err = create_db.Exec()
	}
	//插入数据
	stmt, err := db.Prepare("INSERT INTO userinfo(username, departname, created) values(?,?,?)")
	checkErr(err)
	nt := now_time.Format("2006-01-02 15:04:05")
	res, err := stmt.Exec("astaxie", "研发部门", nt)
	checkErr(err)
	id, err := res.LastInsertId()
	checkErr(err)
	fmt.Println("****最新ID:")
	fmt.Println(id)
	//更新数据
	stmt, err = db.Prepare("update userinfo set username=? where uid=?")
	checkErr(err)
	res, err = stmt.Exec("astaxieupdate", id)
	checkErr(err)
	affect, err := res.RowsAffected()
	checkErr(err)
	fmt.Println("****更新ID:")
	fmt.Println(affect)
	//查询数据
	rows, err := db.Query("SELECT * FROM userinfo")
	checkErr(err)
	for rows.Next() {
		var uid int
		var username string
		var department string
		var created string
		err = rows.Scan(&uid, &username, &department, &created)
		checkErr(err)
		fmt.Println("****查询数据:")
		fmt.Println("uid:" + strconv.Itoa(uid))
		fmt.Println("username:" + username)
		fmt.Println("department:" + department)
		fmt.Println("created:" + created)
	}
	//删除数据
	// stmt, err = db.Prepare("delete from userinfo where uid=?")
	// checkErr(err)
	// res, err = stmt.Exec(id)
	// checkErr(err)
	// affect, err = res.RowsAffected()
	// checkErr(err)
	// fmt.Println("****删除数据:")
	// fmt.Println(affect)

	db.Close()
}
func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

 

mysql - SQLite3 php excel caching method sqlite3 is not availableEOL

mysql - SQLite3 php excel caching method sqlite3 is not availableEOL

有人遇到过这种错误提示么,导入文件的时候报的错误

回复内容:

有人遇到过这种错误提示么,导入文件的时候报的错误

Python 中的参数错误,SQLite3 类型错误:+ 不支持的操作数类型:'sqlite3.Cursor' 和 'str'

Python 中的参数错误,SQLite3 类型错误:+ 不支持的操作数类型:'sqlite3.Cursor' 和 'str'

如何解决Python 中的参数错误,SQLite3 类型错误:+ 不支持的操作数类型:''sqlite3.Cursor'' 和 ''str''

我是编码和这个新社区的初学者。我需要您的帮助才能理解为什么无法获得此解决方案。我想从一个条目中获取一个数字,然后与同一项目的最后一条记录相加,以便我可以将其汇总。

这是我的代码:

  1. def add_stock(self):
  2. time = datetime.Now().strftime("%B %d,%Y")
  3. hour = datetime.Now().strftime("%I:%M%p")
  4. query = ''SELECT totalstock FROM stocks WHERE name = ? AND MovementID = ( SELECT max( MovementID ) FROM stocks)''
  5. parameters = (self.name.get(),)
  6. lastrecord = self.run_query(query,parameters)
  7. total = lastrecord + self.quantity.get()
  8. if self.validation():
  9. query = ''INSERT INTO stocks VALUES(NULL,?,?)''
  10. parameters = (self.name.get(),self.quantity.get(),total,time,hour)
  11. self.run_query(query,parameters)
  12. self.message[''text''] = ''Movement {} added succesfully''.format(self.name.get())
  13. self.name.delete(0,END)
  14. self.quantity.delete(0,END)
  15. else:
  16. self.message[''text''] = ''Name and Quantity required''
  17. self.get_product()

但是有问题,有人可以帮我吗?

这是完整的代码:

  1. from tkinter import *
  2. from tkinter import ttk
  3. from datetime import datetime
  4. import sqlite3
  5. class Main:
  6. db_name = ''materiales.db''
  7. def __init__(self,window):
  8. self.wind = window
  9. self.wind.title(''Stock App'')
  10. #create frame
  11. frame = LabelFrame(self.wind,text = ''Add stock'')
  12. frame.grid(row = 0,column = 0,columnspan = 3,pady = 20)
  13. # Name Input
  14. Label(frame,text = ''Name: '').grid(row = 1,column = 0)
  15. self.name = Entry(frame)
  16. self.name.focus()
  17. self.name.grid(row = 1,column = 1)
  18. # Quantity Input
  19. Label(frame,text = ''Quantity: '').grid(row = 2,column = 0)
  20. self.quantity = Entry(frame)
  21. self.quantity.grid(row = 2,column = 1)
  22. # Button Add Stock
  23. ttk.Button(frame,text = ''Add Stock'',command = self.add_stock).grid(row = 3,columnspan = 2,sticky = W + E)
  24. #Log Message
  25. self.message = Label(text = '''',fg = ''red'')
  26. self.message.grid(row = 3,sticky = W + E)
  27. # Table
  28. self.tree = ttk.Treeview(height = 10,columns = 2)
  29. self.tree.grid(row = 4,columnspan = 2)
  30. self.tree.heading(''#0'',text = ''Name'',anchor = CENTER)
  31. self.tree.heading(''#1'',text = ''Stock'',anchor = CENTER)
  32. #Buttons
  33. ttk.Button(text = ''DELETE'',command = self.delete_product).grid(row = 5,sticky = W + E)
  34. ttk.Button(text = ''MODIFY'',command = self.modify_product).grid(row = 5,column = 1,sticky = W + E)
  35. self.get_product()
  36. def run_query(self,query,parameters = ()):
  37. with sqlite3.connect(self.db_name) as conn:
  38. cursor = conn.cursor()
  39. result = cursor.execute(query,parameters)
  40. conn.commit()
  41. return result
  42. def get_product(self):
  43. records = self.tree.get_children()
  44. for element in records:
  45. self.tree.delete(element)
  46. query = ''SELECT * FROM product ORDER BY name DESC''
  47. db_rows = self.run_query(query)
  48. for row in db_rows:
  49. self.tree.insert('''',text = row[1],values = row[2])
  50. def validation(self):
  51. return len(self.name.get()) != 0 and len(self.quantity.get()) !=0
  52. def add_stock(self):
  53. time = datetime.Now().strftime("%B %d,%Y")
  54. hour = datetime.Now().strftime("%I:%M%p")
  55. query = ''SELECT totalstock FROM stocks WHERE name = ? AND MovementID = ( SELECT max( MovementID ) FROM stocks)''
  56. parameters = (self.name.get(),)
  57. lastrecord = self.run_query(query,parameters)
  58. total = lastrecord + self.quantity.get()
  59. if self.validation():
  60. query = ''INSERT INTO stocks VALUES(NULL,?)''
  61. parameters = (self.name.get(),hour)
  62. self.run_query(query,parameters)
  63. self.message[''text''] = ''Movement {} added succesfully''.format(self.name.get())
  64. self.name.delete(0,END)
  65. self.quantity.delete(0,END)
  66. else:
  67. self.message[''text''] = ''Name and Quantity required''
  68. self.get_product()
  69. def delete_product(self):
  70. try:
  71. self.tree.item(self.tree.selection())[''text''][0]
  72. except IndexError as e:
  73. self.message[''text''] = ''Please Select a Record''
  74. return
  75. name = self.tree.item(self.tree.selection())[''text'']
  76. query = ''DELETE FROM product WHERE name = ?''
  77. self.run_query(query,(name,))
  78. self.message[''text''] = ''Product {} deleted succesfully''.format(name)
  79. self.get_product()
  80. def modify_product(self):
  81. try:
  82. self.tree.item(self.tree.selection())[''text''][0]
  83. except IndexError as e:
  84. self.message[''text''] = ''Please Select a Record''
  85. return
  86. name = self.tree.item(self.tree.selection())[''text'']
  87. old_price = self.tree.item(self.tree.selection())[''values''][0]
  88. self.edit_wind = Toplevel()
  89. self.edit_wind.title = ''Edit Product''
  90. #Old Name
  91. Label(self.edit_wind,text = ''Old Name: '').grid(row = 0,column = 1)
  92. Entry(self.edit_wind,textvariable = StringVar(self.edit_wind,value = name),state = ''readonly'').grid(row = 0,column = 2)
  93. #New Name
  94. Label(self.edit_wind,text = ''New Name: '').grid(row = 1,column = 1)
  95. new_name = Entry(self.edit_wind)
  96. new_name.grid(row = 1,column = 2)
  97. #Old Price
  98. Label(self.edit_wind,text = ''Old Price: '').grid(row = 2,value = old_price),state = ''readonly'').grid(row = 2,column = 2)
  99. #New Price
  100. Label(self.edit_wind,text = ''New Price: '').grid(row = 3,column = 1)
  101. new_price = Entry(self.edit_wind)
  102. new_price.grid(row = 3,column = 2)
  103. Button(self.edit_wind,text = ''Update'',command = lambda: self.edit_records(new_name.get(),name,new_price.get(),old_price)).grid(row = 4,column = 2,sticky = W)
  104. def edit_records(self,new_name,new_price,old_price):
  105. query = ''UPDATE product SET name = ?,precio = ? WHERE name = ? AND precio = ?''
  106. parameters = (new_name,old_price)
  107. self.run_query(query,parameters)
  108. self.edit_wind.destroy()
  109. self.message[''text''] = ''Record {} updated successfully''.format(name)
  110. self.get_product()
  111. if __name__ == ''__main__'':
  112. window = Tk()
  113. application = Main(window)
  114. window.mainloop()

提前致谢并致以亲切的问候。

解决方法

在代码的第 72 行引发异常。该代码尝试将字符串对象添加到 sqlite.Cursor 对象,但由于这些类型与该操作不兼容,因此失败。

相反,您需要提取返回的 Cursor 对象中保存的数据,可以这样做:

  1. total = lastrecord.fetchone()[0]

fetchone() 返回元组类型数据的第一行。元组中的第一项是查询值,在本例中假定为整数。您无法添加由 self.quantity.get() 返回的字符串,因此您需要将其转换为整数(假设它是一个整数......它可能是另一种数字类型)来计算新的总数:

  1. total += int(self.quantity.get())

关于如何使用 WHERE 在 python 中更新 sqlite3 记录?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android – 数据被添加到列表中而不是在addChildEventListener的onChildChanged()中更新、go-sqlite3 操作加密的 sqlite3 数据库不加密、mysql - SQLite3 php excel caching method sqlite3 is not availableEOL、Python 中的参数错误,SQLite3 类型错误:+ 不支持的操作数类型:'sqlite3.Cursor' 和 'str'等相关知识的信息别忘了在本站进行查找喔。

本文标签: