当使用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()
引用),这种方法是否有缺点-例如,速度?
我不知道这是否回答了你的问题,但使用源代码:
在sqlalchemy/lib/sqlalchemy/方言/该软件/initpy:
from .base import SMALLINT
在sqlalchemy/lib/sqlalchemy/方言/该软件/base.py
from ...types import SMALLINT
在sqlalchemy/lib/sqlalchemy types.py& lt; & lt; & lt;sqlalchemy.types.SMALLINT
from .sql.sqltypes import SMALLINT as SMALLINT
更进一步在sqlalchemy
/lib/sqlalchemy/sql/sqltypes.py
class SMALLINT(SmallInteger):
"""The SQL SMALLINT type.
.. seealso::
:class:`_types.SmallInteger` - documentation for the base type.
"""
__visit_name__ = "SMALLINT"
所以对许多人(所有人?)大写类型,使用sqlalchemy.types.XXX
或sqlalchemy.dialects.YYY.XXX
似乎是一样的。所有大写数据类型都继承自CamelCase数据类型(ref)