model 必须要主键
在我看来ORM底层就好好的拼字符串sql搞什么奇葩设定
How do I map a table that has no primary key
大多数ORM要求对象定义某种主键,因为内存中的对象必须对应于数据库表中唯一可识别的行; 至少,这允许对象可以作为UPDATE和DELETE语句的目标, 这些语句将仅影响该对象的行而不影响其他行。但是,主键的重要性远不止于此。
在SQLAlchemy中,所有ORM映射对象始终Session 使用称为身份映射的模式在其特定数据库行中唯一链接, 该模式是SQLAlchemy使用的工作单元系统的核心,也是最关键的模式。 ORM使用的常见(而不是那么常见)模式。
insert
1 |
|
model
1 |
|
add
一股傻逼气息扑面而来 Cannot insert NULL value in column, but I have a default value specified
1 |
|
ERROR
sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1048, "Column 'age' cannot be null")
执行的是这个sql 坑爹啊
1 |
|
speed up
1 |
|
1 |
|
on_duplicate_key_update
only for mysql insert-on-duplicate-key-update-upsert
update or insert by unique key
1 |
|
1 |
|
1 |
|
要想再复杂点马上就跪了
1 |
|
ERROR
1 |
|
然后只能 先select 在update 超傻逼
1 |
|
使用 compiles
Custom SQL Constructs and Compilation Extension SQLAlchemy ON DUPLICATE KEY UPDATE
1 |
|
效果拔群,但是会拖慢正常的insert,拖慢很多
没用compiles
插1000个,用0.138sec ,用了0.624sec 1000个
0.540一个。。。。
test code
1 |
|
all() & first() & scalar()
只要一个object直接first()
多个用all()
数字用
1 |
|
找不到目标
1 |
|
常用gist
sqlalchemy object to list of dict
1 |
|
聚合
1 |
|
1 |
|
and or 拼接
1 |
|
join
1 |
|
子查询 .subquery()
1 |
|
模糊查询
可以用 mysql concat query =
query.filter(func.concat(*columns).like(f'%{keyword}%'))
将字段连起来查询
但是会有造成以下情况 kw 关键字 f 字段
kw = ab f1 = a f2=b 是匹配的 ,当然f1 f2中间可以塞其他特殊字符作为连接符,但是很难保证kw输入什么。
关于转义
在mysql中,反斜杠在字符串中是转义字符,在进行语法解析时会进行一次转义,所以当我们在insert字符时,insert \\
在数据库中最终只会存储\
。
而在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。
因此如果期望最终匹配到\
,就要反转义两次,也即由\
到\\
再到\\\\
。
1 |
|
动态filter
1 |
|
时间间隔统计
1 |
|