pandas 使用sqlalchemy.types优于sqlalchemy.dialects.mssql的优点

zpgglvta  于 2023-04-04  发布在  其他
关注(0)|答案(1)|浏览(114)

当使用SQLAlchemy保存到SQL Server数据库时,除了可移植性之外,使用sqlalchemy.types设置数据类型比使用sqlalchemy.dialects.mssql更有优势吗?
我使用以下方法将数据保存到数据库中(使用pandas的to_sql()):

df_members.to_sql(
    'parliament.member_' + extract_date + '',
    schema='source',
    con=engine,
    index=False,
    dtype={
        'id': sqlalchemy.dialects.mssql.SMALLINT(),
        'gender': sqlalchemy.dialects.mssql.NVARCHAR(1),
        'nameDisplayAs': sqlalchemy.dialects.mssql.NVARCHAR(length=256),
        'nameClean': sqlalchemy.dialects.mssql.NVARCHAR(length=256),
        'count': sqlalchemy.dialects.mssql.TINYINT()
    },
)

我注意到下面的结果是相同的:

df_members.to_sql(
    'parliament.member_' + extract_date + '',
    schema='source',
    con=engine,
    index=False,
    dtype={
        'id': sqlalchemy.types.SMALLINT(),
        'gender': sqlalchemy.types.NVARCHAR(1),
        'nameDisplayAs': sqlalchemy.types.NVARCHAR(length=256),
        'nameClean': sqlalchemy.types.NVARCHAR(length=256),
        'count': sqlalchemy.dialects.mssql.TINYINT()
    },
)

我习惯使用前者,因为它让我不必记住哪些数据类型是特定于供应商的(例如TINYINT()),哪些不是。
但是,假设可移植性不是一个问题(如果我们改变了供应商,代码无论如何都需要更新以删除TINYINT()引用),这种方法是否有缺点-例如,速度?

ufj5ltwl

ufj5ltwl1#

我不知道这是否能回答你的问题,但使用源代码:
在sqlalchemy/lib/sqlalchemy/dialects/mssql/init.py中:

from .base import SMALLINT

在sqlalchemy/lib/sqlalchemy/dialects/mssql/ www.example.com中base.py

from ...types import SMALLINT

在sqlalchemy/lib/sqlalchemy/types.py**〈〈〈sqlalchemy.types.SMALLINT**

from .sql.sqltypes import SMALLINT as SMALLINT

更进一步
在sqlalchemy/lib/sqlalchemy/sql/ www.example.com中sqltypes.py

class SMALLINT(SmallInteger):
    """The SQL SMALLINT type.
    .. seealso::

        :class:`_types.SmallInteger` - documentation for the base type.
    """
    __visit_name__ = "SMALLINT"

因此,对于许多(所有?)大写类型,使用sqlalchemy.types.XXXsqlalchemy.dialects.YYY.XXX似乎是一样的。所有大写数据类型都继承自CamelCase数据类型(ref)

相关问题