鱼C论坛

 找回密码
 立即注册
查看: 351|回复: 12

我想弄成数据库形式的,该怎么弄

[复制链接]
发表于 2024-6-17 13:06:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我用tkinter写一个小程序,用一个excel表格来存一些数据,然后通过公司的网络共享这个表格,然后再把我写的那个小程序分别放在两台电脑里,让这两台电脑都可以通过这个小程序访问并修改这个表格里面的数据,得怎么弄?

之前公司一直是用WPS的云文档,来实现A电脑修改表格,B电脑可以实时看到数据变化,,,但是我用存储文件路径,在通过这个路径用pandas来打开,发现WPS的云文档的存储方式是先用WPS去下载云文档,再通过WPS打开这个文档,,如果我在A电脑上修改了这个文档的话,我在B电脑上直接打开之前存储的文件路径,它访问到的是修改之前的数据,如果想访问到A电脑修改后的数据,就得在B电脑上用WPS再次打开,覆盖了路径下的原先的表格,才能用我写的程序读取到修改后的数据。。。。所以我要怎么解决这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-17 13:06:46 | 显示全部楼层
听上去你遇到了一个非常有意思的问题。可以理解为你希望通过共享Excel文件的方式来实现数据的实时更新和访问,但WPS的云文档显然无法很好地支持这个需求。那么,我们可以考虑换个方案,用数据库来解决这个问题。

为什么会推荐数据库呢?数据库天生就是用来存储和管理数据的,并且支持多用户同时访问和修改数据。我们可以使用SQLite、MySQL或其他数据库来实现你的需求。

这里我们用SQLite来做一个简单的示例,因为它是一个轻量级的嵌入式数据库,无需安装服务器,非常适合小型或个人项目。

首先,我们要定义如何在Python中使用SQLite。我们需要`sqlite3`库,另一个重要的库是`pandas`,用于处理表格数据。

### 1. 初始化数据库

首先要建立一个数据库和一张表。
import sqlite3
import pandas as pd

# 创建数据库连接
conn = sqlite3.connect('shared_data.db')
cursor = conn.cursor()

# 创建一个示例表
cursor.execute('''
CREATE TABLE IF NOT EXISTS employees (
    id INTEGER PRIMARY KEY,
    name TEXT,
    department TEXT,
    salary REAL
)
''')

# 提交并关闭连接
conn.commit()
conn.close()

### 2. 插入数据到数据库
def insert_data():
    # 创建数据库连接
    conn = sqlite3.connect('shared_data.db')
    cursor = conn.cursor()

    # 插入一些示例数据
    cursor.execute("INSERT INTO employees (name, department, salary) VALUES ('Alice', 'HR', 5000)")
    cursor.execute("INSERT INTO employees (name, department, salary) VALUES ('Bob', 'IT', 6000)")
    cursor.execute("INSERT INTO employees (name, department, salary) VALUES ('Charlie', 'Finance', 7000)")

    # 提交并关闭连接
    conn.commit()
    conn.close()

insert_data()

### 3. 读取数据
def fetch_data():
    # 创建数据库连接
    conn = sqlite3.connect('shared_data.db')
    df = pd.read_sql_query("SELECT * FROM employees", conn)
    print(df)
    conn.close()

fetch_data()

### 4. 更新数据
def update_data(employee_id, new_salary):
    # 创建数据库连接
    conn = sqlite3.connect('shared_data.db')
    cursor = conn.cursor()

    # 更新数据
    cursor.execute("UPDATE employees SET salary = ? WHERE id = ?", (new_salary, employee_id))

    # 提交并关闭连接
    conn.commit()
    conn.close()

update_data(1, 5500)
fetch_data()  # 重新读取数据以查看更新结果

### 5. 用Tkinter创建简单的GUI

最后,我们将这些功能整合到一个简单的Tkinter界面中。
import tkinter as tk
from tkinter import messagebox

class App:
    def __init__(self, root):
        self.root = root
        self.root.title("Employee Management")
        
        self.name_label = tk.Label(root, text="Name")
        self.name_label.pack()
        self.name_entry = tk.Entry(root)
        self.name_entry.pack()

        self.dept_label = tk.Label(root, text="Department")
        self.dept_label.pack()
        self.dept_entry = tk.Entry(root)
        self.dept_entry.pack()

        self.salary_label = tk.Label(root, text="Salary")
        self.salary_label.pack()
        self.salary_entry = tk.Entry(root)
        self.salary_entry.pack()

        self.submit_button = tk.Button(root, text="Add Employee", command=self.add_employee)
        self.submit_button.pack()

        self.view_button = tk.Button(root, text="View Employees", command=self.view_employees)
        self.view_button.pack()

    def add_employee(self):
        name = self.name_entry.get()
        dept = self.dept_entry.get()
        salary = self.salary_entry.get()

        if not name or not dept or not salary:
            messagebox.showwarning("Input Error", "All fields are required!")
            return

        conn = sqlite3.connect('shared_data.db')
        cursor = conn.cursor()
        cursor.execute("INSERT INTO employees (name, department, salary) VALUES (?, ?, ?)", (name, dept, float(salary)))
        conn.commit()
        conn.close()

        messagebox.showinfo("Success", "Employee added successfully!")

    def view_employees(self):
        conn = sqlite3.connect('shared_data.db')
        df = pd.read_sql_query("SELECT * FROM employees", conn)
        messagebox.showinfo("Employees", df.to_string())
        conn.close()

root = tk.Tk()
app = App(root)
root.mainloop()

通过这种方式,你不需要再担心文件锁定、冲突等问题了。数据库可以很好地解决并发访问的问题。希望这能帮到你!如果有其他问题,不妨再问我~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-26 16:30:24 | 显示全部楼层
FishC 发表于 2024-6-17 13:06
听上去你遇到了一个非常有意思的问题。可以理解为你希望通过共享Excel文件的方式来实现数据的实时更新和访 ...

小甲鱼有没有这个库的教学视频
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-26 16:30:54 | 显示全部楼层
laiyuanjie 发表于 2024-06-26 16:30
小甲鱼有没有这个库的教学视频


小甲鱼的视频内容通常比较全面和生动。关于使用SQLite数据库的内容,你可以参考小甲鱼的《零基础入门学习Python》系列视频。在这个系列中,他可能没有单独讲解SQLite,但会讲到Python的数据处理部分,包括数据库的使用。

如果需要更详细的SQLite教程,以下是一些学习SQLite的步骤和资源:

### 1. 安装SQLite库
SQLite库通常随Python自带,如果没有,你可以使用以下命令安装:
pip install sqlite3

### 2. 学习基础操作
建议先了解一下SQLite的基础操作,如创建数据库、创建表、插入数据、查询数据等。

### 3. 小甲鱼相关视频
尽管小甲鱼可能没有专门的视频讲解SQLite,但你可以通过他的视频学习Python的基础知识和其他数据库相关知识。建议观看以下内容:

- **零基础入门学习Python**:涵盖了Python的基础知识,非常适合初学者。
- **Python高级编程**:涉及更多高级内容,包括文件操作、数据库等。

### 4. 其他资源
- **SQLite官方网站**:提供详细的文档和教程 [SQLite官网](https://www.sqlite.org/)
- **Python官方文档**:Python数据库接口文档 [Python DB-API](https://docs.python.org/3/library/sqlite3.html)

### 示例代码学习
结合上面的步骤和视频,尝试使用示例代码进行实际操作。以下是一个简单的示例代码,演示如何使用SQLite数据库:
import sqlite3

# 创建或连接到数据库
conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users
                  (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')

# 插入数据
cursor.execute("INSERT INTO users (name, age) VALUES ('Alice', 30)")
cursor.execute("INSERT INTO users (name, age) VALUES ('Bob', 25)")

# 查询数据
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()

for row in rows:
    print(row)

# 更新数据
cursor.execute("UPDATE users SET age = 26 WHERE name = 'Bob'")

# 删除数据
cursor.execute("DELETE FROM users WHERE name = 'Alice'")

# 提交更改并关闭连接
conn.commit()
conn.close()

通过这些资源和示例代码,你可以逐步掌握SQLite的使用方法。如果在学习过程中遇到任何问题,随时来问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-26 16:40:41 | 显示全部楼层
FishC 发表于 2024-6-17 13:06
听上去你遇到了一个非常有意思的问题。可以理解为你希望通过共享Excel文件的方式来实现数据的实时更新和访 ...

用这个库就可以实现AB两个电脑共同访问修改等操作是不是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-26 16:41:26 | 显示全部楼层
laiyuanjie 发表于 2024-06-26 16:40
用这个库就可以实现AB两个电脑共同访问修改等操作是不 ...


是的,使用SQLite库可以实现AB两个电脑共同访问和修改数据库的数据。不过,SQLite虽然适合单用户或少量并发访问的应用场景,但对于高并发访问来说,性能和安全性可能不如客户端-服务器模式的数据库(如MySQL、PostgreSQL)。

### 如何在两个电脑之间共享SQLite数据库

如果你仍然选择使用SQLite,可以通过网络共享的方式实现两个电脑共同访问和修改数据库。以下是一个简单的示例步骤:

### 1. 将SQLite数据库文件放在共享位置

你可以将数据库文件放在一个网络共享文件夹中,这样两个电脑都可以访问这个文件。

### 2. 编写访问SQLite数据库的Python代码

你可以编写一个Python脚本,用于访问和修改数据库。确保每次访问数据库时都要打开和关闭连接,以避免并发访问冲突。

以下是一个简单的示例代码:
import sqlite3
import pandas as pd

# 定义数据库文件的网络共享路径
db_path = r'\\shared_network_path\shared_data.db'

def create_table():
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS employees (
        id INTEGER PRIMARY KEY,
        name TEXT,
        department TEXT,
        salary REAL
    )
    ''')
    conn.commit()
    conn.close()

def insert_data(name, department, salary):
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    cursor.execute("INSERT INTO employees (name, department, salary) VALUES (?, ?, ?)", (name, department, salary))
    conn.commit()
    conn.close()

def fetch_data():
    conn = sqlite3.connect(db_path)
    df = pd.read_sql_query("SELECT * FROM employees", conn)
    print(df)
    conn.close()

def update_data(employee_id, new_salary):
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    cursor.execute("UPDATE employees SET salary = ? WHERE id = ?", (new_salary, employee_id))
    conn.commit()
    conn.close()

# 创建表(仅需执行一次)
create_table()

# 插入数据
insert_data('Alice', 'HR', 5000)
insert_data('Bob', 'IT', 6000)

# 查询数据
fetch_data()

# 更新数据
update_data(1, 5500)

# 再次查询数据
fetch_data()

### 3. 使用Tkinter创建GUI

通过Tkinter创建一个简单的GUI界面,让用户可以方便地插入、查询和更新数据。
import tkinter as tk
from tkinter import messagebox

class App:
    def __init__(self, root):
        self.root = root
        self.root.title("Employee Management")
        
        self.name_label = tk.Label(root, text="Name")
        self.name_label.pack()
        self.name_entry = tk.Entry(root)
        self.name_entry.pack()

        self.dept_label = tk.Label(root, text="Department")
        self.dept_label.pack()
        self.dept_entry = tk.Entry(root)
        self.dept_entry.pack()

        self.salary_label = tk.Label(root, text="Salary")
        self.salary_label.pack()
        self.salary_entry = tk.Entry(root)
        self.salary_entry.pack()

        self.submit_button = tk.Button(root, text="Add Employee", command=self.add_employee)
        self.submit_button.pack()

        self.view_button = tk.Button(root, text="View Employees", command=self.view_employees)
        self.view_button.pack()

    def add_employee(self):
        name = self.name_entry.get()
        dept = self.dept_entry.get()
        salary = self.salary_entry.get()

        if not name or not dept or not salary:
            messagebox.showwarning("Input Error", "All fields are required!")
            return

        insert_data(name, dept, float(salary))
        messagebox.showinfo("Success", "Employee added successfully!")

    def view_employees(self):
        fetch_data()

root = tk.Tk()
app = App(root)
root.mainloop()

通过这种方式,你可以实现两个电脑共同访问和修改SQLite数据库。确保数据库文件放在一个所有计算机都可以访问的共享网络路径中。

如果你需要更高的并发性能和数据安全性,建议使用MySQL、PostgreSQL等更适合多用户并发访问的数据库系统。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-1 21:04:40 | 显示全部楼层
FishC 发表于 2024-6-26 16:41
是的,使用SQLite库可以实现AB两个电脑共同访问和修改数据库的数据。不过,SQLite虽然适合单用户或少量 ...

### 如何在两个电脑之间共享SQLite数据库

如果你仍然选择使用SQLite,可以通过网络共享的方式实现两个电脑共同访问和修改数据库。


像你所说的,通过网络共享的方式的话,那我岂不是直接用这个网络共享的方式,在A电脑上将数据保存在一个EXCEL里面,然后通过B电脑去操作这个A电脑上的EXCEL文件,也可以实现同样的效果,而不必去通过数据库来实现?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-1 21:05:23 | 显示全部楼层
laiyuanjie 发表于 2024-07-01 21:04
### 如何在两个电脑之间共享SQLite数据库

如果你仍 ...


你提到的通过网络共享Excel文件来实现数据同步的方法是可行的,但它存在一些潜在的问题,比如文件锁定、数据一致性、并发控制等。下面我给你详细分析一下这两种方法,并给出一个推荐方案。

### 方案1:网络共享Excel文件

**优点:**
1. 简单直接,无需学习和设置数据库相关的内容。
2. 现有的Excel文件可以直接利用,不需要数据迁移。

**缺点:**
1. 并发访问问题:当多台电脑同时访问和修改同一个Excel文件时,可能会出现文件锁定问题,导致其他电脑无法访问。
2. 数据一致性问题:如果两台电脑同时修改数据,可能会导致数据冲突和不一致。
3. 性能问题:Excel文件在大数据量和高频率访问的情况下,性能较差。

**实现步骤:**
1. 在A电脑上创建一个共享文件夹,并将Excel文件放入其中。
2. 在B电脑上通过网络访问A电脑的共享文件夹。
3. 在Python中使用`pandas`读取和写入共享文件夹中的Excel文件。
import pandas as pd

# 读取Excel文件
df = pd.read_excel(r'\\A电脑的共享路径\文件名.xlsx')

# 修改数据
df.loc[0, '列名'] = '新值'

# 写回Excel文件
df.to_excel(r'\\A电脑的共享路径\文件名.xlsx', index=False)

### 方案2:使用SQLite数据库

**优点:**
1. 并发控制:SQLite支持多用户读取和单用户写入,适合低到中等并发的应用场景。
2. 数据一致性:数据库可以保证数据的一致性和完整性。
3. 灵活查询:SQL语言支持复杂的数据查询和处理。

**缺点:**
1. 需要学习和理解数据库的基本操作。
2. 需要将现有的数据迁移到数据库中。

**实现步骤:**
1. 在A电脑上创建一个共享文件夹,并将SQLite数据库文件放入其中。
2. 在B电脑上通过网络访问A电脑的共享文件夹。
3. 在Python中使用`sqlite3`库读取和写入共享文件夹中的SQLite数据库。
import sqlite3

# 连接到SQLite数据库
conn = sqlite3.connect(r'\\A电脑的共享路径\数据库名.db')
cursor = conn.cursor()

# 读取数据
cursor.execute("SELECT * FROM 表名")
rows = cursor.fetchall()

# 修改数据
cursor.execute("UPDATE 表名 SET 列名 = '新值' WHERE 条件")

# 提交修改
conn.commit()

# 关闭连接
conn.close()

### 推荐方案

如果你的应用场景下数据量不大,访问频率不高,且没有复杂的并发修改需求,可以选择方案1,简单易行。如果需要更好的数据一致性和并发控制,建议选择方案2,将数据迁移到SQLite数据库中进行管理。

### 参考资料

1. 小甲鱼《零基础入门学习Python》系列视频。
2. SQLite官方文档:https://www.sqlite.org/docs.html
3. `pandas`官方文档:https://pandas.pydata.org/docs/

希望这些信息能帮你解决问题!如果有更多疑问,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-1 21:11:50 | 显示全部楼层
FishC 发表于 2024-7-1 21:05
你提到的通过网络共享Excel文件来实现数据同步的方法是可行的,但它存在一些潜在的问题,比如文件锁定 ...

找了一圈,没有讲得比较不错的SQLite库的教学视频,但是发现一个讲MYSQL的,学完用PYTHON操作MYSQL的方法后,是不是可以无缝切换到用python直接操作SQLite库过来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-1 21:12:29 | 显示全部楼层
laiyuanjie 发表于 2024-07-01 21:11
找了一圈,没有讲得比较不错的SQLite库的教学视频,但 ...


是的,学会了使用Python操作MySQL后,切换到操作SQLite会相对容易,因为两者在使用Python进行数据库操作时有很多相似之处。具体来说,你需要掌握的是以下几个方面:

### 1. 安装相应的库

- **MySQL**: 你可能会用到 `mysql-connector-python` 或 `pymysql` 等库。
- **SQLite**: Python 标准库中自带 `sqlite3` 模块,无需额外安装。

### 2. 连接数据库

- **MySQL**:
import mysql.connector

  conn = mysql.connector.connect(
      host="localhost",
      user="yourusername",
      password="yourpassword",
      database="yourdatabase"
  )
  cursor = conn.cursor()

- **SQLite**:
import sqlite3

  conn = sqlite3.connect('yourdatabase.db')
  cursor = conn.cursor()

### 3. 执行SQL语句

- **MySQL**:
cursor.execute("SELECT * FROM yourtable")
  result = cursor.fetchall()
  for row in result:
      print(row)

- **SQLite**:
cursor.execute("SELECT * FROM yourtable")
  result = cursor.fetchall()
  for row in result:
      print(row)

### 4. 插入数据

- **MySQL**:
sql = "INSERT INTO yourtable (name, age) VALUES (%s, %s)"
  val = ("John", 21)
  cursor.execute(sql, val)
  conn.commit()

- **SQLite**:
sql = "INSERT INTO yourtable (name, age) VALUES (?, ?)"
  val = ("John", 21)
  cursor.execute(sql, val)
  conn.commit()

### 5. 更新和删除数据

这部分在两种数据库中的用法也非常相似,主要区别在于占位符的使用和具体的SQL语法。

### 6. 关闭连接

- **MySQL**:
cursor.close()
  conn.close()

- **SQLite**:
cursor.close()
  conn.close()

### 推荐学习顺序

1. **先学MySQL**: MySQL的复杂度稍高,学会后对SQL语句和数据库操作有更深入的理解。
2. **再学SQLite**: SQLite更简单,作为嵌入式数据库,更适合轻量级应用和单用户环境。

### 总结

1. 学会Python操作MySQL后,操作SQLite会相对简单。
2. SQLite适合本地单用户应用,如果有多个用户并发访问的需求,建议使用MySQL等更复杂的数据库。
3. 学习时注意SQL语句和Python数据库操作库的区别和相似之处。

希望这些信息对你有所帮助!如果有更多问题,随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-5 15:37:53 | 显示全部楼层
我倒是建议直接使用windows的“共享文件夹”功能,同一局域网内所有机器都通过IP访问该文件夹内的文件并进行读写操作。将你要编辑的EXCEL文件放到共享文件夹,然后修改python程序的文件路径,让python程序直接读写共享文件夹内的文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-5 17:52:24 | 显示全部楼层
局域网为什么搞的这么麻烦,直接开共享,文件可以读写不就好了,但是共享的时候就麻烦。上面说的,比如文件锁定、数据一致性、并发控制等。用数据库就很好啦,可以在本地开个站点,使用浏览器访问修改数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-6 21:53:00 | 显示全部楼层
emmm
我是技术小白,但是这个场景,好像没那么麻烦。。。
首先已经使用WPS,本身金山有在线多人模式,A电脑账号给编辑权限,B电脑账号只给查看权限即可,对需要公司留档的数据,做定时任务同步保存本地,应该就可以解决楼主的场景问题;
一般情况下,数据一定要保密的情况下,不建议使用WPS,不涉及到保密的话,搭建个数据库可以有效避免脏数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 23:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表