【问题标题】:Will this SQLite based Python code be compatible with MySQL?这个基于 SQLite 的 Python 代码会与 MySQL 兼容吗?
【发布时间】:2016-11-04 18:09:23
【问题描述】:

我有一个 Python 3 应用程序,它直接使用 SQLite,通过执行 SQL 代码字符串(即,不使用像 SQLalchemy 这样的 ORM)。数据库正在这样初始化:

def db_inicialize():
    global DB_PATH
    print(" - Opening database...\n", DB_PATH)
    conn = sqlite3.connect(DB_PATH, detect_types=sqlite3.PARSE_DECLTYPES)
    c = conn.cursor()
    print(" - Locating or creating database...")
    try:
        c.execute("""CREATE TABLE IF NOT EXISTS dados (
                id                INTEGER PRIMARY KEY AUTOINCREMENT,
                destin            TEXT NOT NULL,
                estado            TEXT,
                obj_num           TEXT UNIQUE NOT NULL,
                data_exp          DATETIME,
                valor_cobr        TEXT,
                chq_recebido      TEXT,
                data_depositar    TEXT,
                vols              INTEGER,
                rma               TEXT,
                expedidor         TEXT NOT NULL,
                obs               TEXT,
                arquivado         BOOLEAN,
                data_depositado   DATETIME,
                data_ult_verif    DATETIME,
                data_ult_alt      DATETIME DEFAULT CURRENT_TIMESTAMP,
                estado_detalhado  TEXT
                )""")
    except:
        print(" - It was not possible to create the main table in database.")
        return False
    conn.commit()
    c.close()

然后我运行这样的代码来更改数据库中的内容:

def db_update_estado(info):
    global DB_PATH
    estado = verificar_estado(info)
    if estado != "- N/A -":
        estado_detalhado = obter_estado_detalhado(info)
        agora = datetime.now()
        try:
            conn = sqlite3.connect(DB_PATH)
            c = conn.cursor()
            c.execute("""UPDATE dados SET estado = ?, estado_detalhado = ?, data_ult_verif = ? WHERE obj_num = ?;""", (estado, estado_detalhado, agora, remessa))
            conn.commit()
            c.close()
        except:
            print(" - It was not possible to update this register in the database!")

是否可以安全使用,例如import pymysql,调整数据库连接语句并保留所有SQL相关代码?还是我需要修改所有的 SQL 代码,更改表初始化中的数据类型...?

【问题讨论】:

    标签: mysql sqlite python-3.x pymysql


    【解决方案1】:

    评论太长了。

    MySQL 和 SQLite 是不同的数据库。它们确实有很多相似之处,所以如果你小心的话,你可能会得到适用于两者的代码。但我不打算这样做。

    例如,您的create table 语句为text unique。 MySQL 不支持此功能。您需要使用varchar(xxx),其中 xxx 小于某个值(我将使用实际最大值 255)。

    在处理日期/时间值方面存在许多差异。例如,curdate()date('now'),以及其他功能的许多差异。 SQLite 支持 CTE; MySQL 没有。

    我建议您在其自己的模块中构建特定于数据库的功能。或者,使用 pandas 等通用接口。

    【讨论】:

    • 在开始将代码实际移植到 MySQL 之前,我将进一步探索它。
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多