Python Sqlite3:创建模式而无需使用第二个数据库

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

我想在Python中为sqlite3数据库创建一个模式,但sqlite似乎不支持

CREATE SCHEMA
sqlite文档)。我研究过
ATTACH
,看起来它可以通过使用第二个数据库来完成这项工作,但我只需要一个具有架构的数据库。

我想做一些这样的事情:

import sqlite3
db = sqlite3.connect('db_file.db')
db.execute("CREATE TABLE my_schema.my_table(column TYPE);")
db.commit()

但是,它抛出异常:

Traceback (most recent call last):
  File "C:/Users/Mod/Projects/sandbox/test_db.py", line 8, in <module>
    db.execute("CREATE TABLE my_schema.my_table(column TYPE);")
OperationalError: unknown database my_schema

我知道我可以像这样使用

ATTACH
...

import sqlite3
db = sqlite3.connect('db_file.db')
db.execute("ATTACH DATABASE 'db_file_2.db' AS 'my_schema';")
db.execute("CREATE TABLE my_schema.my_table(column TYPE);")
db.commit()

...但是有没有办法在没有第二个数据库的情况下创建模式?

python database sqlite
3个回答
18
投票

在我们的项目中,我们使用 Postgresql 作为生产数据库,每个服务都有单独的模式。 我想使用 Sqlite3 进行单元测试。所以我需要一种创建模式的方法。

接受的答案帮助我找到了解决方案。 我在我的项目中使用 SQLAlchemy(在 Flask 中以及 Flask-SQLAlchemy)。

我想在这里分享我是如何做到的,希望它可以帮助别人。

假设我正在使用内存数据库,并且我想要使用的模式是

my_schema
。命令如下所示:

from sqlalchemy import create_engine

eng = create_engine("sqlite://")
conn = eng.connect()
conn.execute("attach ':memory:' as my_schema")

您可以在以下位置找到有关 SQLAlchemy 中 SQLite 使用的更多信息: http://docs.sqlalchemy.org/en/latest/dialects/sqlite.html

如果您使用 Flask-SQLAlchemy,您可以按照以下方式执行与上面示例相同的操作:

from flask_sqlalchemy import SQLAlchemy

SQLALCHEMY_DATABASE_URI = 'sqlite://'

db = SQLAlchemy()
# Create Flask app object, attach it to db object, and then do:
with app.app_context():
    with db.engine.connect() as con:
        con.execute("attach ':memory:' as svc_kpi")

8
投票

主数据库始终命名为

main
,您无法更改该名称。

可以只需创建一个内存数据库并使用任意名称将数据库附加到该数据库:

conn = sqlite3.connect(':memory:')
conn.execute("attach ? as 'schemaname'", (filename,))

但是,如果您打算使用该数据库作为主 MySQL 数据库的后备,我强烈建议您查看 SQLAlchemy 来处理此处的数据库抽象,并让它担心为 MySQL 或 MySQL 生成正确的 SQL SQLite。


0
投票

当尝试遵循已接受的答案时,我遇到了问题

sqlalchemy.exc.ObjectNotExecutableError: Not an executable object: "attach ':memory:' as party_master"

为了解决这个问题,我必须这样做:

from sqlalchemy import create_engine

engine = create_engine("sqlite://")
connection = engine.raw_connection()
try:
    # Get a SQLite cursor from the connection
    cursor = connection.cursor()
    # Execute the ATTACH DATABASE command
    cursor.execute("ATTACH DATABASE ':memory:' AS party_master")
    # Commit the transaction
    connection.commit()
finally:
    # Close the connection
    connection.close()
© www.soinside.com 2019 - 2024. All rights reserved.