Python/Telethon在SQLite数据库上操作错误:无法打开数据库文件

1 投票
1 回答
154 浏览
提问于 2025-04-14 18:33

我有一个用Python和Telethon做的Telegram机器人项目,这个项目包含一个Python文件、一个SQLite数据库和一个配置文件。这个机器人在我本地的虚拟环境中运行得很好(这三个文件都在同一个文件夹里),但是当我尝试在Ubuntu服务器上运行这个Python文件时,遇到了以下错误。

项目文件放在 /usr/local/bin/project/ 目录下:

Traceback (most recent call last):
  File "/usr/local/bin/project/script.py", line 19, in <module>
    client = TelegramClient(session_name, API_ID, API_HASH).start(bot_token=BOT_TOKEN)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/telethon/client/telegrambaseclient.py", line 289, in __init__
    session = SQLiteSession(session)
              ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/telethon/sessions/sqlite.py", line 47, in __init__
    c = self._cursor()
        ^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/telethon/sessions/sqlite.py", line 242, in _cursor
    self._conn = sqlite3.connect(self.filename,
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: unable to open database file

下面是script.py的内容:

import configparser
import re
from telethon import TelegramClient, Button, events
import sqlite3
from datetime import datetime
import traceback

print("Initializing configurations...")
config = configparser.ConfigParser()
config.read('config.ini', encoding='utf-8')

API_ID = config.get('default','api_id') 
API_HASH = config.get('default','api_hash')
BOT_TOKEN = config.get('default','bot_token')
session_name = "sessions/Bot"

# Start the bot session
client = TelegramClient(session_name, API_ID, API_HASH).start(bot_token=BOT_TOKEN)

@client.on(events.NewMessage(pattern="(?i)/start"))
async def start(event):
    
    sender = await event.get_sender()
    SENDER = str(sender.id)
    
    await event.reply('Hello!.')
    
##### MAIN
if __name__ == '__main__':
    try:
        print("Initializing Database...")
        # Connect to local database
        db_name = 'database.db'
        conn = sqlite3.connect(db_name, check_same_thread=False)
        # Create the cursor
        crsr = conn.cursor() 
        print("Connected to the database")

        # Command that creates the "customers" table 
        sql_command = """CREATE TABLE IF NOT EXISTS customers ( 
            id INTEGER PRIMARY KEY AUTOINCREMENT, 
            lname VARCHAR(200),
            fname VARCHAR(200), 
            note VARCHAR(200));"""
        crsr.execute(sql_command)
        print("All tables are ready")

        print("Bot Started")
        client.run_until_disconnected()

    except Exception as error:
        print('Cause: {}'.format(error))

这些是 config.ini 的内容:

; DO NOT MODIFY THE LINE BELOW!!! ([default])
[default]


; EDITABLE FIELDS:
api_id = 000000
api_hash = 000000000000000000
bot_token = 00000000000000000000000000

我检查了这三个文件的权限,结果如下:

-rw-r--rw- 1 root root 10601 Mar  4 00:52 script.py

-rw-rw-rw- 1 root root 716800 Mar  4 00:52 database.db

-rw-r--rw- 1 root root 195 Mar  4 00:52 config.ini

1 个回答

3

TelegramClient 默认会尝试创建一个 sqlite 文件来存储会话信息。

你传给 TelegramClient 构造函数的第一个参数是会话名,默认情况下就是会话的名称(或者完整路径)。https://docs.telethon.dev/en/stable/concepts/sessions.html

因为你把会话命名为 "sessions/Bot",所以它会尝试找一个叫 "sessions" 的文件夹,然后创建一个名为 "Bot" 的数据库文件。但它找不到这个文件夹。

要解决这个问题,你可以把 session_name 改成一个简单的文件名,比如 "Bot"。或者你也可以手动创建一个空的 sessions 文件夹,这样就可以正常工作了。

希望这能帮到你!

撰写回答