Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlalchemy,创建sqlite数据库(如果没有';不存在_Python_Sql_Sqlite_Sqlalchemy - Fatal编程技术网

Python sqlalchemy,创建sqlite数据库(如果没有';不存在

Python sqlalchemy,创建sqlite数据库(如果没有';不存在,python,sql,sqlite,sqlalchemy,Python,Sql,Sqlite,Sqlalchemy,我正在尝试sqlalchemy,并使用此连接字符串连接到我的数据库 engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db') 如果目录中还没有sqlite数据库,sqlalchemy是否为您创建sqlite数据库?它应该获取数据库文件?是的,sqlalchemy确实为您创建了一个数据库。我在windows上使用此代码确认了这一点 from sqlalchemy import create_engine, ForeignKey

我正在尝试sqlalchemy,并使用此连接字符串连接到我的数据库

engine = create_engine('sqlite:///C:\\sqlitedbs\\database.db')

如果目录中还没有sqlite数据库,sqlalchemy是否为您创建sqlite数据库?它应该获取数据库文件?

是的,sqlalchemy确实为您创建了一个数据库。我在windows上使用此代码确认了这一点

from sqlalchemy import create_engine, ForeignKey
from sqlalchemy import Column, Date, Integer, String
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///C:\\sqlitedbs\\school.db', echo=True)
Base = declarative_base()


class School(Base):

    __tablename__ = "woot"

    id = Column(Integer, primary_key=True)
    name = Column(String)  


    def __init__(self, name):

        self.name = name    


Base.metadata.create_all(engine)
我发现(使用sqlite+pysqlite)如果目录存在,它将创建它,但如果目录不存在,它将抛出一个异常:

OperationalError: (sqlite3.OperationalError) unable to open database file
我的解决办法是这样做,尽管感觉很糟糕:

    if connection_string.startswith('sqlite'):
        db_file = re.sub("sqlite.*:///", "", connection_string)
        os.makedirs(os.path.dirname(db_file), exist_ok=True)
    self.engine = sqlalchemy.create_engine(connection_string)

正如其他人所发布的,SQLAlchemy将自动完成这项工作。然而,当我


我使用了
SQLALCHEMY\u数据库\u URI=”sqlite:///path/to/file.db“
当我应该使用四个斜杠时:
SQLALCHEMY\u DATABASE\u URI=”sqlite:////path/to/file.db“

Linux存储的SQLite3数据库

将在与.py文件相同的文件夹中创建数据库:

engine = create_engine('sqlite:///school.db', echo=True)

将在与.py文件相同的文件夹中实例化school.db文件。

因此,如果sqlite数据库是您指向的目录中的现有文件,它将调用它?Ie:如果存在,连接到它,否则创建它。我说的对吗?当然,我发现是这样的。如果其他人感到困惑:文件是在
create\u all(engine)
语句中创建的,而不是在
create\u engine(…)
语句中创建的。对,在这种情况下,我可能只会向用户打印一条消息,说,“很抱歉,我无法创建数据库FOO,因为目录栏不存在。“然后,如果用户想要创建并继续,他们可以。对于交互式应用程序,这很好,但我也希望它在持续集成上下文中工作。一旦目录存在,它将在持续集成中工作。”。您必须确定丢失的目录是否是一个错误并需要用户干预(在这种情况下,您会生成一条错误消息并放弃),或者丢失的目录是否只是一个警告或小异常,在这种情况下,您会创建(可能是整条)目录并继续执行,正如您所说的,这是“令人讨厌的”。或者你让它可配置…通过“使其可配置”,我的意思是提供一个配置设置,用户可以说“创建任何丢失的目录而不打扰我”或“如果目录丢失,请告诉我,我会为您创建它们。”这是我的问题!