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

问题描述 投票:0回答:1

我有一个 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
python sqlite permissions telethon
1个回答
0
投票

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

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

由于您已将会话命名为

"sessions/Bot"
,因此它会尝试查找名为
"sessions"
的文件夹,然后创建名为
"Bot"
的数据库文件。但找不到该文件夹。

要修复此错误,您可以将

session_name
更改为类似
"Bot"
的文件名。或者您也可以只创建一个空文件夹名称
sessions
,它应该可以正常工作。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.