【问题标题】:Python Sqlite3: Create a schema without having to use a second databasePython Sqlite3:无需使用第二个数据库即可创建模式
【发布时间】:2017-07-03 11:44:14
【问题描述】:

我想在 python 中为 sqlite3 数据库创建一个模式,但 sqlite 似乎不支持CREATE SCHEMA (sqlite docs)。我查看了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()

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

【问题讨论】:

  • 那为什么还需要模式呢?为什么不直接使用CREATE TABLE my_table(column TYPE);
  • 无论如何,主数据库使用架构名称main
  • 对不起,我应该在我的原始帖子中澄清。我必须使用来自 MySQL 数据库的相同 INSERT 查询。如果 mysql db 连接以任何方式失败,则会创建 sqlite3 数据库。
  • 通过将 SQLite 模式设置为 main,我设法在 PostgreSQL 和 SQLite 之间保留了类似的 SQLAlchemy 代码。

标签: python database sqlite


【解决方案1】:

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

accepted answer 帮助我找到了解决方案。 我在我的项目中使用 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")

【讨论】:

    【解决方案2】:

    主数据库始终命名为main,您无法更改该名称。

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

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

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

    【讨论】:

    • 数据是否会保存到附件的数据库文件中?我会研究 SQLAlchemy,但我的主管一直在使用 pyodbc,所以我一直在尝试使用他已经使用的相同工具和包。
    • @JohnSmithy:是的,如果您使用限定名称,插入将转到正确的数据库。 SQLAlchemy 可以使用 pyodbc 连接。
    • 太棒了,这就是我需要知道的。如果我可以投票给你,我会的!谢谢你的帮助!!
    猜你喜欢
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多